462852c3f3
Co-Authored-By: Claude Code <noreply@anthropic.com>
161 lines
8.4 KiB
Python
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'),
|
|
),
|
|
]
|