0001_initial.py 24 KB

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