0001_initial.py 22 KB

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