0001_initial.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. import django.db.models.deletion
  2. import django.utils.timezone
  3. from django.conf import settings
  4. from django.contrib.postgres.fields import JSONField
  5. from django.contrib.postgres.search import SearchVectorField
  6. from django.db import migrations, models
  7. import misago.threads.models.attachment
  8. class Migration(migrations.Migration):
  9. initial = True
  10. dependencies = [
  11. ('misago_categories', '0001_initial'),
  12. migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  13. ]
  14. operations = [
  15. migrations.CreateModel(
  16. name='Post',
  17. fields=[
  18. (
  19. 'id', models.AutoField(
  20. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  21. )
  22. ),
  23. ('poster_name', models.CharField(max_length=255)),
  24. ('poster_ip', models.GenericIPAddressField()),
  25. ('original', models.TextField()),
  26. ('parsed', models.TextField()),
  27. ('checksum', models.CharField(max_length=64, default='-')),
  28. ('attachments_cache', JSONField(null=True, blank=True)),
  29. ('posted_on', models.DateTimeField()),
  30. ('updated_on', models.DateTimeField()),
  31. ('edits', models.PositiveIntegerField(default=0)),
  32. ('last_editor_name', models.CharField(max_length=255, null=True, blank=True)),
  33. ('last_editor_slug', models.SlugField(max_length=255, null=True, blank=True)),
  34. (
  35. 'hidden_by', models.ForeignKey(
  36. related_name='+',
  37. on_delete=django.db.models.deletion.SET_NULL,
  38. blank=True,
  39. to=settings.AUTH_USER_MODEL,
  40. null=True
  41. )
  42. ),
  43. ('hidden_by_name', models.CharField(max_length=255, null=True, blank=True)),
  44. ('hidden_by_slug', models.SlugField(max_length=255, null=True, blank=True)),
  45. ('hidden_on', models.DateTimeField(default=django.utils.timezone.now)),
  46. ('has_reports', models.BooleanField(default=False)),
  47. ('has_open_reports', models.BooleanField(default=False)),
  48. ('is_unapproved', models.BooleanField(default=False, db_index=True)),
  49. ('is_hidden', models.BooleanField(default=False)),
  50. ('is_protected', models.BooleanField(default=False)),
  51. (
  52. 'category', models.ForeignKey(
  53. on_delete=django.db.models.deletion.CASCADE,
  54. to='misago_categories.Category',
  55. )
  56. ),
  57. (
  58. 'last_editor', models.ForeignKey(
  59. related_name='+',
  60. on_delete=django.db.models.deletion.SET_NULL,
  61. blank=True,
  62. to=settings.AUTH_USER_MODEL,
  63. null=True
  64. )
  65. ),
  66. (
  67. 'mentions', models.ManyToManyField(
  68. related_name='mention_set', to=settings.AUTH_USER_MODEL
  69. )
  70. ),
  71. (
  72. 'poster', models.ForeignKey(
  73. on_delete=django.db.models.deletion.SET_NULL,
  74. blank=True,
  75. to=settings.AUTH_USER_MODEL,
  76. null=True
  77. )
  78. ),
  79. ('is_event', models.BooleanField(default=False, db_index=True)),
  80. ('event_type', models.CharField(max_length=255, null=True, blank=True)),
  81. ('event_context', JSONField(null=True, blank=True)),
  82. ('likes', models.PositiveIntegerField(default=0)),
  83. ('last_likes', JSONField(blank=True, null=True)),
  84. ('search_document', models.TextField(blank=True, null=True)),
  85. ('search_vector', SearchVectorField()),
  86. ],
  87. options={},
  88. bases=(models.Model, ),
  89. ),
  90. migrations.CreateModel(
  91. name='Thread',
  92. fields=[
  93. (
  94. 'id', models.AutoField(
  95. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  96. )
  97. ),
  98. ('title', models.CharField(max_length=255)),
  99. ('slug', models.CharField(max_length=255)),
  100. ('replies', models.PositiveIntegerField(default=0, db_index=True)),
  101. ('has_events', models.BooleanField(default=False)),
  102. ('has_poll', models.BooleanField(default=False)),
  103. ('has_reported_posts', models.BooleanField(default=False)),
  104. ('has_open_reports', models.BooleanField(default=False)),
  105. ('has_unapproved_posts', models.BooleanField(default=False)),
  106. ('has_hidden_posts', models.BooleanField(default=False)),
  107. ('started_on', models.DateTimeField(db_index=True)),
  108. ('starter_name', models.CharField(max_length=255)),
  109. ('starter_slug', models.CharField(max_length=255)),
  110. ('last_post_is_event', models.BooleanField(default=False)),
  111. ('last_post_on', models.DateTimeField(db_index=True)),
  112. ('last_poster_name', models.CharField(max_length=255, null=True, blank=True)),
  113. ('last_poster_slug', models.CharField(max_length=255, null=True, blank=True)),
  114. ('weight', models.PositiveIntegerField(default=0)),
  115. ('is_unapproved', models.BooleanField(default=False, db_index=True)),
  116. ('is_hidden', models.BooleanField(default=False)),
  117. ('is_closed', models.BooleanField(default=False)),
  118. ],
  119. options={},
  120. bases=(models.Model, ),
  121. ),
  122. migrations.CreateModel(
  123. name='ThreadParticipant',
  124. fields=[
  125. (
  126. 'id', models.AutoField(
  127. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  128. )
  129. ),
  130. (
  131. 'thread', models.ForeignKey(
  132. on_delete=django.db.models.deletion.CASCADE,
  133. to='misago_threads.Thread',
  134. )
  135. ),
  136. (
  137. 'user', models.ForeignKey(
  138. on_delete=django.db.models.deletion.CASCADE,
  139. to=settings.AUTH_USER_MODEL,
  140. )
  141. ),
  142. ('is_owner', models.BooleanField(default=False)),
  143. ],
  144. options={},
  145. bases=(models.Model, ),
  146. ),
  147. migrations.AddField(
  148. model_name='thread',
  149. name='participants',
  150. field=models.ManyToManyField(
  151. related_name='privatethread_set',
  152. through='misago_threads.ThreadParticipant',
  153. to=settings.AUTH_USER_MODEL
  154. ),
  155. preserve_default=True,
  156. ),
  157. migrations.AddField(
  158. model_name='post',
  159. name='thread',
  160. field=models.ForeignKey(
  161. on_delete=django.db.models.deletion.CASCADE,
  162. to='misago_threads.Thread',
  163. ),
  164. preserve_default=True,
  165. ),
  166. migrations.AddField(
  167. model_name='thread',
  168. name='first_post',
  169. field=models.ForeignKey(
  170. related_name='+',
  171. on_delete=django.db.models.deletion.SET_NULL,
  172. blank=True,
  173. to='misago_threads.Post',
  174. null=True
  175. ),
  176. preserve_default=True,
  177. ),
  178. migrations.AddField(
  179. model_name='thread',
  180. name='category',
  181. field=models.ForeignKey(
  182. on_delete=django.db.models.deletion.CASCADE,
  183. to='misago_categories.Category',
  184. ),
  185. preserve_default=True,
  186. ),
  187. migrations.AddField(
  188. model_name='thread',
  189. name='last_post',
  190. field=models.ForeignKey(
  191. related_name='+',
  192. on_delete=django.db.models.deletion.SET_NULL,
  193. blank=True,
  194. to='misago_threads.Post',
  195. null=True
  196. ),
  197. preserve_default=True,
  198. ),
  199. migrations.AddField(
  200. model_name='thread',
  201. name='last_poster',
  202. field=models.ForeignKey(
  203. related_name='last_poster_set',
  204. on_delete=django.db.models.deletion.SET_NULL,
  205. blank=True,
  206. to=settings.AUTH_USER_MODEL,
  207. null=True
  208. ),
  209. preserve_default=True,
  210. ),
  211. migrations.AddField(
  212. model_name='thread',
  213. name='starter',
  214. field=models.ForeignKey(
  215. on_delete=django.db.models.deletion.SET_NULL,
  216. blank=True,
  217. to=settings.AUTH_USER_MODEL,
  218. null=True
  219. ),
  220. preserve_default=True,
  221. ),
  222. migrations.AlterIndexTogether(
  223. name='thread',
  224. index_together=set([
  225. ('category', 'id'),
  226. ('category', 'last_post_on'),
  227. ('category', 'replies'),
  228. ]),
  229. ),
  230. migrations.AlterIndexTogether(
  231. name='post',
  232. index_together=set([
  233. ('thread', 'id'),
  234. ('is_event', 'is_hidden'),
  235. ('poster', 'posted_on'),
  236. ]),
  237. ),
  238. migrations.CreateModel(
  239. name='Subscription',
  240. fields=[
  241. (
  242. 'id', models.AutoField(
  243. verbose_name='ID', serialize=False, auto_created=True, primary_key=True
  244. )
  245. ),
  246. ('last_read_on', models.DateTimeField(default=django.utils.timezone.now)),
  247. ('send_email', models.BooleanField(default=False)),
  248. (
  249. 'category', models.ForeignKey(
  250. on_delete=django.db.models.deletion.CASCADE,
  251. to='misago_categories.Category',
  252. )
  253. ),
  254. (
  255. 'thread', models.ForeignKey(
  256. on_delete=django.db.models.deletion.CASCADE,
  257. to='misago_threads.Thread',
  258. )
  259. ),
  260. (
  261. 'user', models.ForeignKey(
  262. on_delete=django.db.models.deletion.CASCADE,
  263. to=settings.AUTH_USER_MODEL,
  264. )
  265. ),
  266. ],
  267. options={},
  268. bases=(models.Model, ),
  269. ),
  270. migrations.AlterIndexTogether(
  271. name='subscription',
  272. index_together=set([
  273. ('send_email', 'last_read_on'),
  274. ]),
  275. ),
  276. migrations.CreateModel(
  277. name='PostEdit',
  278. fields=[
  279. (
  280. 'id', models.AutoField(
  281. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  282. )
  283. ),
  284. ('edited_on', models.DateTimeField(default=django.utils.timezone.now)),
  285. ('editor_name', models.CharField(max_length=255)),
  286. ('editor_slug', models.CharField(max_length=255)),
  287. ('editor_ip', models.GenericIPAddressField()),
  288. ('edited_from', models.TextField()),
  289. ('edited_to', models.TextField()),
  290. (
  291. 'category', models.ForeignKey(
  292. on_delete=django.db.models.deletion.CASCADE,
  293. to='misago_categories.Category'
  294. )
  295. ),
  296. (
  297. 'editor', models.ForeignKey(
  298. blank=True,
  299. null=True,
  300. on_delete=django.db.models.deletion.SET_NULL,
  301. to=settings.AUTH_USER_MODEL
  302. )
  303. ),
  304. (
  305. 'post', models.ForeignKey(
  306. on_delete=django.db.models.deletion.CASCADE,
  307. related_name='edits_record',
  308. to='misago_threads.Post'
  309. )
  310. ),
  311. (
  312. 'thread', models.ForeignKey(
  313. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  314. )
  315. ),
  316. ],
  317. options={
  318. 'ordering': ['-id'],
  319. },
  320. ),
  321. migrations.CreateModel(
  322. name='Attachment',
  323. fields=[
  324. (
  325. 'id', models.AutoField(
  326. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  327. )
  328. ),
  329. ('secret', models.CharField(max_length=64)),
  330. (
  331. 'uploaded_on',
  332. models.DateTimeField(default=django.utils.timezone.now, db_index=True)
  333. ),
  334. ('uploader_name', models.CharField(max_length=255)),
  335. ('uploader_slug', models.CharField(max_length=255, db_index=True)),
  336. ('uploader_ip', models.GenericIPAddressField()),
  337. ('filename', models.CharField(max_length=255, db_index=True)),
  338. ('size', models.PositiveIntegerField(default=0, db_index=True)),
  339. (
  340. 'thumbnail', models.ImageField(
  341. max_length=255,
  342. blank=True,
  343. null=True,
  344. upload_to=misago.threads.models.attachment.upload_to
  345. )
  346. ),
  347. (
  348. 'image', models.ImageField(
  349. max_length=255,
  350. blank=True,
  351. null=True,
  352. upload_to=misago.threads.models.attachment.upload_to
  353. )
  354. ),
  355. (
  356. 'file', models.FileField(
  357. max_length=255,
  358. blank=True,
  359. null=True,
  360. upload_to=misago.threads.models.attachment.upload_to
  361. )
  362. ),
  363. (
  364. 'post', models.ForeignKey(
  365. blank=True,
  366. null=True,
  367. on_delete=django.db.models.deletion.SET_NULL,
  368. to='misago_threads.Post'
  369. )
  370. ),
  371. ],
  372. ),
  373. migrations.CreateModel(
  374. name='AttachmentType',
  375. fields=[
  376. (
  377. 'id', models.AutoField(
  378. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  379. )
  380. ),
  381. ('name', models.CharField(max_length=255)),
  382. ('extensions', models.CharField(max_length=255)),
  383. ('mimetypes', models.CharField(blank=True, max_length=255, null=True)),
  384. ('size_limit', models.PositiveIntegerField(default=1024)),
  385. (
  386. 'status', models.PositiveIntegerField(
  387. choices=[(0, 'Allow uploads and downloads'), (1, 'Allow downloads only'),
  388. (2, 'Disallow both uploading and downloading')],
  389. default=0
  390. )
  391. ),
  392. (
  393. 'limit_downloads_to', models.ManyToManyField(
  394. blank=True,
  395. related_name='_attachmenttype_limit_downloads_to_+',
  396. to='misago_acl.Role'
  397. )
  398. ),
  399. (
  400. 'limit_uploads_to', models.ManyToManyField(
  401. blank=True,
  402. related_name='_attachmenttype_limit_uploads_to_+',
  403. to='misago_acl.Role'
  404. )
  405. ),
  406. ],
  407. ),
  408. migrations.AddField(
  409. model_name='attachment',
  410. name='filetype',
  411. field=models.ForeignKey(
  412. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.AttachmentType'
  413. ),
  414. ),
  415. migrations.AddField(
  416. model_name='attachment',
  417. name='uploader',
  418. field=models.ForeignKey(
  419. blank=True,
  420. null=True,
  421. on_delete=django.db.models.deletion.SET_NULL,
  422. to=settings.AUTH_USER_MODEL
  423. ),
  424. ),
  425. migrations.CreateModel(
  426. name='Poll',
  427. fields=[
  428. (
  429. 'id', models.AutoField(
  430. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  431. )
  432. ),
  433. ('poster_name', models.CharField(max_length=255)),
  434. ('poster_slug', models.CharField(max_length=255)),
  435. ('poster_ip', models.GenericIPAddressField()),
  436. ('posted_on', models.DateTimeField(default=django.utils.timezone.now)),
  437. ('length', models.PositiveIntegerField(default=0)),
  438. ('question', models.CharField(max_length=255)),
  439. ('choices', django.contrib.postgres.fields.jsonb.JSONField()),
  440. ('allowed_choices', models.PositiveIntegerField(default=1)),
  441. ('allow_revotes', models.BooleanField(default=False)),
  442. ('votes', models.PositiveIntegerField(default=0)),
  443. ('is_public', models.BooleanField(default=False)),
  444. (
  445. 'category', models.ForeignKey(
  446. on_delete=django.db.models.deletion.CASCADE,
  447. to='misago_categories.Category'
  448. )
  449. ),
  450. (
  451. 'poster', models.ForeignKey(
  452. blank=True,
  453. null=True,
  454. on_delete=django.db.models.deletion.SET_NULL,
  455. to=settings.AUTH_USER_MODEL
  456. )
  457. ),
  458. (
  459. 'thread', models.OneToOneField(
  460. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  461. )
  462. ),
  463. ],
  464. ),
  465. migrations.CreateModel(
  466. name='PollVote',
  467. fields=[
  468. (
  469. 'id', models.AutoField(
  470. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  471. )
  472. ),
  473. ('voter_name', models.CharField(max_length=255)),
  474. ('voter_slug', models.CharField(max_length=255)),
  475. ('voter_ip', models.GenericIPAddressField()),
  476. ('voted_on', models.DateTimeField(default=django.utils.timezone.now)),
  477. ('choice_hash', models.CharField(db_index=True, max_length=12)),
  478. (
  479. 'category', models.ForeignKey(
  480. on_delete=django.db.models.deletion.CASCADE,
  481. to='misago_categories.Category'
  482. )
  483. ),
  484. (
  485. 'poll', models.ForeignKey(
  486. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Poll'
  487. )
  488. ),
  489. (
  490. 'thread', models.ForeignKey(
  491. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  492. )
  493. ),
  494. (
  495. 'voter', models.ForeignKey(
  496. blank=True,
  497. null=True,
  498. on_delete=django.db.models.deletion.SET_NULL,
  499. to=settings.AUTH_USER_MODEL
  500. )
  501. ),
  502. ],
  503. ),
  504. migrations.AlterIndexTogether(
  505. name='pollvote',
  506. index_together=set([
  507. ('poll', 'voter_name'),
  508. ]),
  509. ),
  510. migrations.CreateModel(
  511. name='PostLike',
  512. fields=[
  513. (
  514. 'id', models.AutoField(
  515. auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
  516. )
  517. ),
  518. ('liker_name', models.CharField(max_length=255, db_index=True)),
  519. ('liker_slug', models.CharField(max_length=255)),
  520. ('liker_ip', models.GenericIPAddressField()),
  521. ('liked_on', models.DateTimeField(default=django.utils.timezone.now)),
  522. (
  523. 'category', models.ForeignKey(
  524. on_delete=django.db.models.deletion.CASCADE,
  525. to='misago_categories.Category'
  526. )
  527. ),
  528. ],
  529. options={
  530. 'ordering': ['-id'],
  531. },
  532. ),
  533. migrations.AddField(
  534. model_name='postlike',
  535. name='post',
  536. field=models.ForeignKey(
  537. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Post'
  538. ),
  539. ),
  540. migrations.AddField(
  541. model_name='postlike',
  542. name='thread',
  543. field=models.ForeignKey(
  544. on_delete=django.db.models.deletion.CASCADE, to='misago_threads.Thread'
  545. ),
  546. ),
  547. migrations.AddField(
  548. model_name='postlike',
  549. name='liker',
  550. field=models.ForeignKey(
  551. blank=True,
  552. null=True,
  553. on_delete=django.db.models.deletion.SET_NULL,
  554. to=settings.AUTH_USER_MODEL
  555. ),
  556. ),
  557. migrations.AddField(
  558. model_name='post',
  559. name='liked_by',
  560. field=models.ManyToManyField(
  561. related_name='liked_post_set',
  562. through='misago_threads.PostLike',
  563. to=settings.AUTH_USER_MODEL
  564. ),
  565. ),
  566. ]