Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. from collections import OrderedDict
  2.  
  3. __ALL__ = ("tables")
  4.  
  5. def pk(t):
  6. return "{0} primary key".format(t)
  7.  
  8. def fk(t, table, column="id"):
  9. return "{0} references {1} ({2}) on delete cascade on update cascade".format(t, table, column)
  10.  
  11. def nn(t):
  12. return "{0} not null".format(t)
  13.  
  14. def unique(t):
  15. return "{0} unique".format(t)
  16.  
  17.  
  18. def constraint(name="", body=None):
  19. left_side = ""
  20. if name:
  21. left_side = "constraint " + name
  22. return (left_side, body)
  23.  
  24. def check_bool(field):
  25. return constraint(
  26. name=("bool_" + field),
  27. body="check ({0} in (0,1))".format(field))
  28.  
  29. def date_precendance(before, after):
  30. return constraint(
  31. name="date_precendace_{0}_and_{1}".format(before, after),
  32. body="check ({0} < {1})".format(before, after))
  33.  
  34. def check_date(field):
  35. return constraint(
  36. name="date_"+field,
  37. body="check ({0} > 0)".format(field))
  38.  
  39. def constraint_pk(*fields):
  40. return constraint(body="primary key ({0})".format(",".join(fields)))
  41.  
  42. def check_enum(field, *values):
  43. return constraint(name="enum_"+field,
  44. body="check ({0} in ({1}))".format(field, ",".join('"{0}"'.format(v) for v in values)))
  45.  
  46. tables = OrderedDict([
  47. ("companies", OrderedDict(
  48. [
  49. ("id", pk("integer")),
  50. ("name", unique(nn("text")))
  51. ])
  52. ),
  53. ("projects", OrderedDict(
  54. [
  55. ("id", pk("integer")),
  56. ("begin_date", nn("integer")),
  57. ("end_date", nn("integer")),
  58. date_precendance("begin_date", "end_date"),
  59. check_date("begin_date")
  60. ])
  61. ),
  62. ("developers", OrderedDict(
  63. [
  64. ("full_name", nn("text")),
  65. ("username", pk("text")),
  66. ("company_id", nn(fk("integer", "companies"))),
  67. ("password", nn("text")),
  68. ("is_admin", nn("integer")),
  69. check_bool("is_admin")
  70. ])
  71. ),
  72. ("developers_distribution", OrderedDict(
  73. [
  74. ("developer_username", nn(fk("text", "developers", "username"))),
  75. ("project_id", nn(fk("integer", "projects"))),
  76. ("is_manager", nn("integer")),
  77. constraint_pk("developer_username", "project_id"),
  78. check_bool("is_manager")
  79. ])
  80. ),
  81. ("tasks", OrderedDict(
  82. [
  83. ("id", pk("integer")),
  84. ("title", nn("text")),
  85. ("description", nn("text")),
  86. ("project_id", nn(fk("integer", "projects"))),
  87. ("hours", nn("integer")),
  88. ("status", nn("integer")),
  89. check_enum("status", "active", "finished", "delayed")
  90. ])
  91. ),
  92. ("tasks_dependencies", OrderedDict(
  93. [
  94. ("task_id", nn(fk("integer", "tasks"))),
  95. ("depended_task_id", nn(fk("integer", "tasks"))),
  96. constraint_pk("task_id", "depended_task_id")
  97. ])
  98. ),
  99. ("contracts", OrderedDict(
  100. [
  101. ("number", pk("integer")),
  102. ("company_id", nn(fk("integer", "companies"))),
  103. ("project_id", nn(fk("integer", "projects"))),
  104. ("date_of_creation", nn("integer")),
  105. ("status", nn("integer")),
  106. check_date("date_of_creation"),
  107. check_enum("status", "active", "finished", "delayed")
  108. ])
  109. ),
  110. ("reports", OrderedDict(
  111. [
  112. ("id", pk("integer")),
  113. ("developer_id", nn(fk("integer", "developers", "username"))),
  114. ("task_id", nn(fk("integer", "tasks"))),
  115. ("begin_date", nn("integer")),
  116. ("end_date", nn("integer")),
  117. ("description", nn("text")),
  118. date_precendance("begin_date", "end_date"),
  119. check_date("begin_date")
  120. ])
  121. ),
  122. ])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement