Files
fangke/server/tracker/migrations/0001_initial.py
T

161 lines
8.4 KiB
Python

# Generated by Django 5.2.17 on 2026-09-15 03:46
import django.db.models.deletion
import tracker.models
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Site',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('site_id', models.CharField(default=tracker.models.short_public_id, max_length=32, unique=True)),
('domains', models.JSONField(default=list)),
('allow_no_origin', models.BooleanField(default=False)),
('is_active', models.BooleanField(default=True)),
('timezone', models.CharField(default='Asia/Shanghai', max_length=64)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'site',
},
),
migrations.CreateModel(
name='Visitor',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('visitor_id', models.CharField(max_length=64)),
('first_seen_at', models.DateTimeField(auto_now_add=True)),
('last_seen_at', models.DateTimeField(auto_now_add=True)),
('first_referrer_domain', models.CharField(blank=True, default='', max_length=200)),
('first_utm', models.JSONField(blank=True, default=dict)),
('first_landing_path', models.CharField(blank=True, default='', max_length=500)),
('device_type', models.CharField(blank=True, default='', max_length=16)),
('os', models.CharField(blank=True, default='', max_length=64)),
('browser', models.CharField(blank=True, default='', max_length=64)),
('language', models.CharField(blank=True, default='', max_length=32)),
('timezone_name', models.CharField(blank=True, default='', max_length=64)),
('screen', models.CharField(blank=True, default='', max_length=32)),
('last_ip', models.GenericIPAddressField(blank=True, null=True)),
('country', models.CharField(blank=True, default='', max_length=64)),
('province', models.CharField(blank=True, default='', max_length=64)),
('city', models.CharField(blank=True, default='', max_length=64)),
('visit_count', models.PositiveIntegerField(default=0)),
('active_days', models.PositiveIntegerField(default=0)),
('last_active_date', models.DateField(blank=True, null=True)),
('is_bot', models.BooleanField(default=False)),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='visitors', to='tracker.site')),
],
options={
'db_table': 'visitor',
},
),
migrations.CreateModel(
name='VisitSession',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('session_id', models.CharField(max_length=64)),
('started_at', models.DateTimeField()),
('ended_at', models.DateTimeField()),
('referrer_domain', models.CharField(blank=True, default='', max_length=200)),
('utm', models.JSONField(blank=True, default=dict)),
('landing_path', models.CharField(blank=True, default='', max_length=500)),
('event_count', models.PositiveIntegerField(default=0)),
('duration_ms', models.PositiveBigIntegerField(default=0)),
('stay_ms', models.PositiveBigIntegerField(default=0)),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sessions', to='tracker.site')),
('visitor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sessions', to='tracker.visitor')),
],
options={
'db_table': 'visit_session',
},
),
migrations.CreateModel(
name='Event',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('event_id', models.CharField(max_length=64)),
('event_name', models.CharField(max_length=50)),
('occurred_at', models.DateTimeField()),
('received_at', models.DateTimeField(auto_now_add=True)),
('path', models.CharField(blank=True, default='', max_length=500)),
('title', models.CharField(blank=True, default='', max_length=200)),
('properties', models.JSONField(blank=True, default=dict)),
('ip', models.GenericIPAddressField(blank=True, null=True)),
('country', models.CharField(blank=True, default='', max_length=64)),
('province', models.CharField(blank=True, default='', max_length=64)),
('city', models.CharField(blank=True, default='', max_length=64)),
('late', models.BooleanField(default=False)),
('is_bot', models.BooleanField(default=False)),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='events', to='tracker.site')),
('visitor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='events', to='tracker.visitor')),
('session', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='events', to='tracker.visitsession')),
],
options={
'db_table': 'event',
},
),
migrations.CreateModel(
name='DailyStat',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField()),
('pv', models.PositiveIntegerField(default=0)),
('uv', models.PositiveIntegerField(default=0)),
('sessions', models.PositiveIntegerField(default=0)),
('new_visitors', models.PositiveIntegerField(default=0)),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='daily_stats', to='tracker.site')),
],
options={
'db_table': 'daily_stat',
'constraints': [models.UniqueConstraint(fields=('site', 'date'), name='uq_site_date')],
},
),
migrations.AddIndex(
model_name='visitor',
index=models.Index(fields=['site', '-last_seen_at'], name='visitor_site_id_fff759_idx'),
),
migrations.AddIndex(
model_name='visitor',
index=models.Index(fields=['site', 'country'], name='visitor_site_id_d862c0_idx'),
),
migrations.AddConstraint(
model_name='visitor',
constraint=models.UniqueConstraint(fields=('site', 'visitor_id'), name='uq_site_visitor'),
),
migrations.AddIndex(
model_name='visitsession',
index=models.Index(fields=['visitor', '-started_at'], name='visit_sessi_visitor_b5bace_idx'),
),
migrations.AddConstraint(
model_name='visitsession',
constraint=models.UniqueConstraint(fields=('site', 'session_id'), name='uq_site_session'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['site', 'visitor', '-occurred_at'], name='event_site_id_e859e2_idx'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['session', 'occurred_at'], name='event_session_1ea951_idx'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['site', 'event_name', '-occurred_at'], name='event_site_id_07b8d1_idx'),
),
migrations.AddConstraint(
model_name='event',
constraint=models.UniqueConstraint(fields=('site', 'event_id'), name='uq_site_event'),
),
]