saas-market-analysis-dubai/apps/analytics/migrations/0001_initial.py
2025-09-17 03:04:22 +05:30

279 lines
20 KiB
Python

# Generated by Django 4.2.24 on 2025-09-16 18:51
import django.contrib.postgres.indexes
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Developer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('developer_number', models.CharField(db_index=True, max_length=20, unique=True)),
('developer_name_en', models.CharField(max_length=255)),
],
options={
'db_table': 'developers',
},
),
migrations.CreateModel(
name='Project',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('project_number', models.CharField(db_index=True, max_length=20, unique=True)),
('project_name_en', models.CharField(max_length=255)),
('start_date', models.DateTimeField()),
('end_date', models.DateTimeField(blank=True, null=True)),
('adoption_date', models.DateTimeField(blank=True, null=True)),
('project_type', models.CharField(choices=[('Normal', 'Normal'), ('Escrow', 'Escrow')], max_length=50)),
('project_value', models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True)),
('escrow_account_number', models.CharField(blank=True, max_length=50)),
('project_status', models.CharField(choices=[('ACTIVE', 'Active'), ('PENDING', 'Pending'), ('CANCELLED', 'Cancelled'), ('COMPLETED', 'Completed')], max_length=20)),
('percent_completed', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
('inspection_date', models.DateTimeField(blank=True, null=True)),
('completion_date', models.DateTimeField(blank=True, null=True)),
('description_en', models.TextField(blank=True)),
('area_en', models.CharField(max_length=100)),
('zone_en', models.CharField(max_length=100)),
('count_land', models.IntegerField(default=0)),
('count_building', models.IntegerField(default=0)),
('count_villa', models.IntegerField(default=0)),
('count_unit', models.IntegerField(default=0)),
('master_project_en', models.CharField(blank=True, max_length=255)),
('developer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='analytics.developer')),
],
options={
'db_table': 'projects',
},
),
migrations.CreateModel(
name='Valuation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('property_total_value', models.DecimalField(decimal_places=2, max_digits=15)),
('area_en', models.CharField(max_length=100)),
('actual_area', models.DecimalField(decimal_places=2, max_digits=10)),
('procedure_year', models.IntegerField()),
('procedure_number', models.CharField(max_length=20)),
('instance_date', models.DateTimeField()),
('actual_worth', models.DecimalField(decimal_places=2, max_digits=15)),
('procedure_area', models.DecimalField(decimal_places=2, max_digits=10)),
('property_type', models.CharField(choices=[('Unit', 'Unit'), ('Villa', 'Villa'), ('Land', 'Land'), ('Building', 'Building')], max_length=50)),
('property_sub_type', models.CharField(max_length=50)),
],
options={
'db_table': 'valuations',
'indexes': [django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='valuations_area_en_ed1677_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['property_type'], name='valuations_propert_180e4b_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['procedure_year'], name='valuations_procedu_3bf0d9_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['instance_date'], name='valuations_instanc_68649f_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['property_total_value'], name='valuations_propert_e9ba02_btree')],
},
),
migrations.CreateModel(
name='MarketTrend',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('area_en', models.CharField(max_length=100)),
('property_type', models.CharField(max_length=50)),
('period_start', models.DateTimeField()),
('period_end', models.DateTimeField()),
('average_price', models.DecimalField(decimal_places=2, max_digits=15)),
('median_price', models.DecimalField(decimal_places=2, max_digits=15)),
('price_change_percent', models.DecimalField(decimal_places=2, max_digits=5)),
('transaction_count', models.IntegerField()),
('volume', models.DecimalField(decimal_places=2, max_digits=15)),
('price_per_sqft', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)),
],
options={
'db_table': 'market_trends',
'indexes': [django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='market_tren_area_en_f508af_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['property_type'], name='market_tren_propert_cc3ff3_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['period_start'], name='market_tren_period__1c6afd_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['period_end'], name='market_tren_period__fdd6ac_btree')],
},
),
migrations.CreateModel(
name='Land',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('land_type', models.CharField(choices=[('Agricultural', 'Agricultural'), ('Commercial', 'Commercial'), ('Residential', 'Residential'), ('Industrial', 'Industrial')], max_length=50)),
('property_sub_type', models.CharField(max_length=50)),
('actual_area', models.DecimalField(decimal_places=2, max_digits=10)),
('is_offplan', models.CharField(choices=[('Ready', 'Ready'), ('Off-Plan', 'Off-Plan')], max_length=10)),
('pre_registration_number', models.CharField(blank=True, max_length=50)),
('is_freehold', models.CharField(choices=[('Free Hold', 'Free Hold'), ('Non Free Hold', 'Non Free Hold')], max_length=20)),
('dm_zip_code', models.CharField(blank=True, max_length=10)),
('master_project', models.CharField(blank=True, max_length=255)),
('area_en', models.CharField(max_length=100)),
('zone_en', models.CharField(max_length=100)),
('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lands', to='analytics.project')),
],
options={
'db_table': 'lands',
},
),
migrations.CreateModel(
name='Forecast',
fields=[
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('area_en', models.CharField(max_length=100)),
('property_type', models.CharField(max_length=50)),
('property_sub_type', models.CharField(blank=True, max_length=50)),
('forecast_date', models.DateTimeField()),
('predicted_price', models.DecimalField(decimal_places=2, max_digits=15)),
('confidence_interval_lower', models.DecimalField(decimal_places=2, max_digits=15)),
('confidence_interval_upper', models.DecimalField(decimal_places=2, max_digits=15)),
('model_version', models.CharField(default='1.0', max_length=20)),
('accuracy_score', models.DecimalField(blank=True, decimal_places=4, max_digits=5, null=True)),
('metadata', models.JSONField(default=dict)),
],
options={
'db_table': 'forecasts',
'indexes': [django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='forecasts_area_en_11cdb4_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['property_type'], name='forecasts_propert_ba8084_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['forecast_date'], name='forecasts_forecas_5092f3_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['predicted_price'], name='forecasts_predict_dd61f3_btree')],
},
),
migrations.CreateModel(
name='Broker',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('broker_number', models.CharField(db_index=True, max_length=20, unique=True)),
('broker_name_en', models.CharField(max_length=255)),
('gender', models.CharField(choices=[('male', 'Male'), ('female', 'Female'), ('أنثى', 'Female (Arabic)')], max_length=10)),
('license_start_date', models.DateTimeField()),
('license_end_date', models.DateTimeField()),
('webpage', models.URLField(blank=True, null=True)),
('phone', models.CharField(blank=True, max_length=50)),
('fax', models.CharField(blank=True, max_length=50)),
('real_estate_number', models.CharField(blank=True, max_length=20)),
('real_estate_name_en', models.CharField(blank=True, max_length=255)),
],
options={
'db_table': 'brokers',
'indexes': [django.contrib.postgres.indexes.BTreeIndex(fields=['broker_number'], name='brokers_broker__af1383_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['real_estate_name_en'], name='brokers_real_es_8151b8_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['license_end_date'], name='brokers_license_364105_btree')],
},
),
migrations.CreateModel(
name='Transaction',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('transaction_number', models.CharField(db_index=True, max_length=50, unique=True)),
('instance_date', models.DateTimeField()),
('group', models.CharField(choices=[('Mortgage', 'Mortgage'), ('Sale', 'Sale'), ('Rent', 'Rent'), ('Other', 'Other')], max_length=50)),
('procedure', models.CharField(max_length=100)),
('is_offplan', models.CharField(choices=[('Off-Plan', 'Off-Plan'), ('Ready', 'Ready')], max_length=10)),
('is_freehold', models.CharField(choices=[('Free Hold', 'Free Hold'), ('Non Free Hold', 'Non Free Hold')], max_length=20)),
('usage', models.CharField(choices=[('Residential', 'Residential'), ('Commercial', 'Commercial'), ('Industrial', 'Industrial'), ('Mixed', 'Mixed')], max_length=50)),
('area_en', models.CharField(max_length=100)),
('property_type', models.CharField(choices=[('Unit', 'Unit'), ('Villa', 'Villa'), ('Land', 'Land'), ('Building', 'Building')], max_length=50)),
('property_sub_type', models.CharField(max_length=50)),
('transaction_value', models.DecimalField(decimal_places=2, max_digits=15)),
('procedure_area', models.DecimalField(decimal_places=2, max_digits=10)),
('actual_area', models.DecimalField(decimal_places=2, max_digits=10)),
('rooms', models.CharField(blank=True, max_length=20)),
('parking', models.CharField(blank=True, max_length=20)),
('nearest_metro', models.CharField(blank=True, max_length=100)),
('nearest_mall', models.CharField(blank=True, max_length=100)),
('nearest_landmark', models.CharField(blank=True, max_length=100)),
('total_buyer', models.IntegerField(default=0)),
('total_seller', models.IntegerField(default=0)),
('master_project', models.CharField(blank=True, max_length=255)),
('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transactions', to='analytics.project')),
],
options={
'db_table': 'transactions',
'indexes': [django.contrib.postgres.indexes.BTreeIndex(fields=['transaction_number'], name='transaction_transac_cb7167_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['instance_date'], name='transaction_instanc_860e4d_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='transaction_area_en_32b046_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['property_type'], name='transaction_propert_050c21_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['transaction_value'], name='transaction_transac_ced5e2_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['group'], name='transaction_group_dff2f7_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['usage'], name='transaction_usage_cbb322_btree')],
},
),
migrations.CreateModel(
name='Rent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('registration_date', models.DateTimeField()),
('start_date', models.DateTimeField()),
('end_date', models.DateTimeField()),
('version', models.CharField(choices=[('New', 'New'), ('Renewed', 'Renewed')], max_length=20)),
('area_en', models.CharField(max_length=100)),
('contract_amount', models.DecimalField(decimal_places=2, max_digits=15)),
('annual_amount', models.DecimalField(decimal_places=2, max_digits=15)),
('is_freehold', models.CharField(choices=[('Free Hold', 'Free Hold'), ('Non Free Hold', 'Non Free Hold')], max_length=20)),
('actual_area', models.DecimalField(decimal_places=2, max_digits=10)),
('property_type', models.CharField(choices=[('Unit', 'Unit'), ('Villa', 'Villa'), ('Land', 'Land'), ('Building', 'Building')], max_length=50)),
('property_sub_type', models.CharField(max_length=50)),
('rooms', models.CharField(blank=True, max_length=20)),
('usage', models.CharField(choices=[('Residential', 'Residential'), ('Commercial', 'Commercial'), ('Industrial', 'Industrial'), ('Mixed', 'Mixed')], max_length=50)),
('nearest_metro', models.CharField(blank=True, max_length=100)),
('nearest_mall', models.CharField(blank=True, max_length=100)),
('nearest_landmark', models.CharField(blank=True, max_length=100)),
('parking', models.CharField(blank=True, max_length=20)),
('total_properties', models.IntegerField(default=1)),
('master_project', models.CharField(blank=True, max_length=255)),
('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rents', to='analytics.project')),
],
options={
'db_table': 'rents',
'indexes': [django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='rents_area_en_65e0af_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['property_type'], name='rents_propert_26942d_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['registration_date'], name='rents_registr_f97ec7_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['start_date'], name='rents_start_d_2ade73_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['end_date'], name='rents_end_dat_a35991_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['contract_amount'], name='rents_contrac_e5a0c2_btree'), django.contrib.postgres.indexes.BTreeIndex(fields=['annual_amount'], name='rents_annual__9b7544_btree')],
},
),
migrations.AddIndex(
model_name='project',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['project_number'], name='projects_project_aade24_btree'),
),
migrations.AddIndex(
model_name='project',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['project_status'], name='projects_project_88dc90_btree'),
),
migrations.AddIndex(
model_name='project',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='projects_area_en_699858_btree'),
),
migrations.AddIndex(
model_name='project',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['zone_en'], name='projects_zone_en_f0caa4_btree'),
),
migrations.AddIndex(
model_name='project',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['developer'], name='projects_develop_2fe1f2_btree'),
),
migrations.AddIndex(
model_name='land',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['land_type'], name='lands_land_ty_91d1c0_btree'),
),
migrations.AddIndex(
model_name='land',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['area_en'], name='lands_area_en_048760_btree'),
),
migrations.AddIndex(
model_name='land',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['zone_en'], name='lands_zone_en_6165db_btree'),
),
migrations.AddIndex(
model_name='land',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['is_freehold'], name='lands_is_free_d51a4a_btree'),
),
migrations.AddIndex(
model_name='land',
index=django.contrib.postgres.indexes.BTreeIndex(fields=['actual_area'], name='lands_actual__3a7c21_btree'),
),
]