0001_initial.py 22 KB

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