0001_initial.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # Generated by Django 4.1.2 on 2025-08-07 22:15
  2. from django.conf import settings
  3. from django.db import migrations, models
  4. import django.db.models.deletion
  5. class Migration(migrations.Migration):
  6. initial = True
  7. dependencies = [
  8. migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  9. ]
  10. operations = [
  11. migrations.CreateModel(
  12. name='Users',
  13. fields=[
  14. ('user_id', models.AutoField(primary_key=True, serialize=False, verbose_name='用户ID')),
  15. ('name', models.CharField(max_length=80, verbose_name='姓名')),
  16. ('openid', models.CharField(max_length=100, unique=True, verbose_name='OPENID')),
  17. ('appid', models.CharField(max_length=100, verbose_name='APPID')),
  18. ('roles', models.CharField(choices=[('ADM', '管理员'), ('USR', '普通用户'), ('DEV', '开发者')], default='USR', max_length=10, verbose_name='角色')),
  19. ('vip', models.PositiveIntegerField(default=1, verbose_name='VIP等级')),
  20. ('vip_time', models.DateTimeField(auto_now_add=True, verbose_name='VIP生效时间')),
  21. ('is_delete', models.BooleanField(default=False, verbose_name='删除标记')),
  22. ('developer', models.BooleanField(default=False, verbose_name='开发者标记')),
  23. ('t_code', models.CharField(max_length=100, unique=True, verbose_name='交易验证码')),
  24. ('ip', models.GenericIPAddressField(verbose_name='注册IP')),
  25. ('avatar', models.ImageField(blank=True, default='/static/img/user.jpg', null=True, upload_to='avatars/', verbose_name='头像')),
  26. ('email', models.EmailField(blank=True, default='email@email.com', max_length=254, null=True, verbose_name='邮箱')),
  27. ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='手机号')),
  28. ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='地址')),
  29. ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
  30. ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
  31. ('user_name', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='user_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
  32. ],
  33. options={
  34. 'verbose_name': '用户档案',
  35. 'verbose_name_plural': '用户档案',
  36. 'db_table': 'user_profile',
  37. 'ordering': ['-create_time'],
  38. },
  39. ),
  40. migrations.CreateModel(
  41. name='AcademicProfile',
  42. fields=[
  43. ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='user_academic_profile', serialize=False, to='userprofile.users', verbose_name='关联用户')),
  44. ('role', models.CharField(choices=[('UG', '本科生'), ('MS', '硕士生'), ('PhD', '博士生'), ('PD', '博士后'), ('FAC', '教职工'), ('RES', '研究员')], default='MS', max_length=10, verbose_name='学术身份')),
  45. ('enrollment_year', models.PositiveIntegerField(help_text='格式:YYYY(如2023)', verbose_name='入学年份')),
  46. ('graduation_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='预计毕业年份')),
  47. ('department', models.CharField(max_length=100, verbose_name='院系/研究所')),
  48. ('major', models.CharField(max_length=100, verbose_name='专业方向')),
  49. ('research_tags', models.CharField(blank=True, help_text='用逗号分隔多个方向(如:人工智能,教育技术)', max_length=255, verbose_name='研究方向')),
  50. ('skill_tags', models.CharField(blank=True, help_text='用逗号分隔多个技能(如:Python,数据分析)', max_length=255, verbose_name='技能标签')),
  51. ],
  52. options={
  53. 'verbose_name': '学术档案',
  54. 'verbose_name_plural': '学术档案',
  55. 'db_table': 'user_academic_profile',
  56. },
  57. ),
  58. migrations.CreateModel(
  59. name='ResearchGroup',
  60. fields=[
  61. ('group_id', models.AutoField(primary_key=True, serialize=False, verbose_name='小组ID')),
  62. ('name', models.CharField(max_length=100, unique=True, verbose_name='小组名称')),
  63. ('description', models.TextField(blank=True, verbose_name='小组描述')),
  64. ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
  65. ('is_active', models.BooleanField(default=True, verbose_name='是否活跃')),
  66. ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_groups', to='userprofile.users', verbose_name='创建人')),
  67. ],
  68. options={
  69. 'verbose_name': '教研小组',
  70. 'verbose_name_plural': '教研小组',
  71. 'db_table': 'user_research_group',
  72. 'ordering': ['-created_at'],
  73. },
  74. ),
  75. migrations.CreateModel(
  76. name='GroupMembership',
  77. fields=[
  78. ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  79. ('role', models.CharField(choices=[('LEAD', '组长'), ('DEP', '副组长'), ('CORE', '核心成员'), ('MEM', '普通成员'), ('ADV', '指导老师'), ('OBS', '观察员')], default='MEM', max_length=20, verbose_name='小组角色')),
  80. ('status', models.CharField(choices=[('ACT', '活跃'), ('LV', '请假'), ('INAC', '不活跃'), ('GRAD', '已毕业'), ('TRF', '已转组')], default='ACT', max_length=10, verbose_name='在组状态')),
  81. ('joined_at', models.DateTimeField(auto_now_add=True, verbose_name='加入时间')),
  82. ('left_at', models.DateTimeField(blank=True, null=True, verbose_name='离开时间')),
  83. ('custom_permissions', models.JSONField(blank=True, default=dict, help_text='JSON格式存储额外权限', null=True, verbose_name='特殊权限')),
  84. ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='members', to='userprofile.researchgroup', verbose_name='所属小组')),
  85. ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_memberships', to='userprofile.users', verbose_name='成员')),
  86. ],
  87. options={
  88. 'verbose_name': '小组成员',
  89. 'verbose_name_plural': '小组成员',
  90. 'db_table': 'user_group_membership',
  91. 'ordering': ['-joined_at'],
  92. 'unique_together': {('user', 'group')},
  93. },
  94. ),
  95. ]