0001_initial.py 24 KB

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