# 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'), ), ]