No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

em_test.py 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #!/usr/bin/python3
  2. #
  3. # This file is part of Lodel 2 (https://github.com/OpenEdition)
  4. #
  5. # Copyright (C) 2015-2017 Cléo UMS-3287
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License, version 3,
  9. # as published by the Free Software Foundation.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU Affero General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Affero General Public License
  17. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. from lodel.context import LodelContext
  20. LodelContext.init()
  21. from lodel.settings.settings import Settings as settings
  22. settings('globconf.d')
  23. from lodel.settings import Settings
  24. from lodel.editorial_model.components import *
  25. from lodel.editorial_model.exceptions import *
  26. from lodel.editorial_model.model import EditorialModel
  27. em = EditorialModel('testem', 'Test editorial model')
  28. base_group = em.new_group( 'base_group',
  29. display_name = 'Base group',
  30. help_text = 'Base group that implements base EM features (like classtype)'
  31. )
  32. ####################
  33. # Lodel Object #
  34. ####################
  35. em_abstract = em.new_class( 'abstract_object',
  36. display_name = 'Abstract lodel object',
  37. help_text = 'For testing purpose',
  38. group = base_group,
  39. abstract = True)
  40. em_object = em.new_class( 'object',
  41. display_name = 'Object',
  42. help_text = 'Main class for all Em objects',
  43. group = base_group,
  44. abstract = True,
  45. parents = em_abstract,
  46. )
  47. em_object.new_field( 'lodel_id',
  48. display_name = 'Lodel identifier',
  49. help_text = 'Uniq ID that identify every lodel object',
  50. group = base_group,
  51. data_handler = 'uniqid',
  52. internal = True,
  53. )
  54. em_object.new_field( 'help_text',
  55. display_name = 'Help',
  56. help_text = 'A short text that describe the object',
  57. group = base_group,
  58. internal = True,
  59. data_handler = 'text',
  60. )
  61. em_object.new_field( 'date_create',
  62. display_name = 'Creation date',
  63. group = base_group,
  64. data_handler = 'datetime',
  65. now_on_create = True,
  66. internal = True,
  67. )
  68. em_object.new_field( 'date_update',
  69. display_name = 'Last update',
  70. group = base_group,
  71. data_handler = 'datetime',
  72. now_on_update = True,
  73. internal = True,
  74. )
  75. ########################
  76. # Lodel old classtypes #
  77. ########################
  78. entitie = em.new_class( 'entitie',
  79. display_name = 'entitie',
  80. help_text = 'Replace old entity classtype',
  81. abstract = True,
  82. group = base_group,
  83. parents = em_object,
  84. )
  85. person = em.new_class( 'person',
  86. display_name = 'Person',
  87. help_text = 'Replace old person classtype',
  88. abstract = False,
  89. group = base_group,
  90. parents = em_object,
  91. )
  92. person.new_field( 'firstname',
  93. display_name = {
  94. 'eng': 'Firstname',
  95. 'fre': 'Prénom',
  96. },
  97. data_handler = 'varchar',
  98. group = base_group,
  99. )
  100. person.new_field( 'lastname',
  101. display_name = {
  102. 'eng': 'Lastname',
  103. 'fre': 'Nom de famille',
  104. },
  105. data_handler = 'varchar',
  106. group = base_group,
  107. )
  108. person.new_field( 'fullname',
  109. display_name = {
  110. 'eng': 'Fullname',
  111. 'fre': 'Nom complet',
  112. },
  113. group = base_group,
  114. data_handler = 'Concat',
  115. field_list = ['firstname', 'lastname'],
  116. immutable = True,
  117. )
  118. person.new_field( 'alias',
  119. display_name = 'alias',
  120. help_text = {
  121. 'eng': 'Link to other person class instance that represent the same person',
  122. 'fre': 'Lien vers un ensemble d\'instances de la classe personne représentant le même individu',
  123. },
  124. data_handler = 'set',
  125. allowed_classes = [person],
  126. default = None,
  127. nullable = True,
  128. group = base_group,
  129. )
  130. entry = em.new_class( 'entry',
  131. display_name = 'Entry',
  132. help_text = 'Replace olf entry classtype',
  133. abstract = True,
  134. group = base_group,
  135. parents = em_object,
  136. )
  137. #####################
  138. # Editorial classes #
  139. #####################
  140. editorial_group = em.new_group( 'editorial_abstract',
  141. display_name = 'Editorial base',
  142. help_text = {
  143. 'eng': 'Contains abstract class to handler editorial contents',
  144. 'fre': 'Contient les classes abstraites permetant la gestion de contenu éditorial'
  145. },
  146. depends = (base_group,)
  147. )
  148. # Classe texte
  149. text = em.new_class( 'text',
  150. display_name = 'Text',
  151. help_text = 'Abstract class that represent texts',
  152. group = editorial_group,
  153. abstract = True,
  154. parents = entitie,
  155. )
  156. text.new_field( 'title',
  157. display_name = {'eng': 'Title', 'fre': 'Titre'},
  158. group = editorial_group,
  159. data_handler = 'varchar',
  160. nullable = True,)
  161. text.new_field( 'subtitle',
  162. display_name = {
  163. 'eng': 'Subtitle',
  164. 'fre': 'Sous-titre',
  165. },
  166. group = editorial_group,
  167. data_handler = 'varchar',
  168. nullable = True,
  169. default = None)
  170. # Classe collection
  171. collection = em.new_class( 'collection',
  172. display_name = 'Collection',
  173. group = editorial_group,
  174. abstract = False,
  175. parents = entitie)
  176. collection.new_field( 'title',
  177. display_name = 'Title',
  178. group = editorial_group,
  179. data_handler = 'varchar'
  180. )
  181. # Classe publication
  182. publication = em.new_class( 'publication',
  183. display_name = 'Publication',
  184. group = editorial_group,
  185. abstract = False,
  186. parents = entitie,)
  187. publication.new_field( 'collection',
  188. display_name = 'Collection',
  189. group = editorial_group,
  190. data_handler = 'link',
  191. default = None,
  192. nullable = True,
  193. allowed_classes = [collection],
  194. back_reference = ('collection', 'publications'))
  195. collection.new_field( 'publications',
  196. display_name = 'Publications',
  197. group = editorial_group,
  198. data_handler = 'list',
  199. allowed_classes = [publication],
  200. back_reference = ('publication', 'collection'))
  201. #########################
  202. # Texte definition #
  203. #########################
  204. section = em.new_class( 'section',
  205. display_name = 'Section',
  206. group = editorial_group,
  207. abstract = False,
  208. parents = text)
  209. subsection = em.new_class( 'subsection',
  210. display_name = 'Subsection',
  211. group = editorial_group,
  212. abstract = False,
  213. parents = section)
  214. section.new_field( 'childs',
  215. display_name = 'Next section',
  216. group = editorial_group,
  217. data_handler = 'hierarch',
  218. allowed_classes = [subsection],
  219. back_reference = ('subsection', 'parent'),
  220. default = None,
  221. nullable = True)
  222. subsection.new_field( 'parent',
  223. display_name = 'Parent',
  224. group = editorial_group,
  225. data_handler = 'link',
  226. default = None,
  227. nullable = True,
  228. allowed_classes = [section],
  229. back_reference = ('section', 'childs'))
  230. #####################
  231. # Persons & authors #
  232. #####################
  233. editorial_person_group = em.new_group( 'editorial_person',
  234. display_name = 'Editorial person',
  235. help_text = {
  236. 'eng': 'Introduce the concept of editorial person (authors, translator etc)',
  237. 'fre': 'Contient les classes servant à la gestion des personnes editorials (auteurs, traducteur...)',
  238. },
  239. depends = (editorial_group,)
  240. )
  241. text_person = em.new_class( 'text_person',
  242. display_name = {
  243. 'eng': 'TextPerson',
  244. 'fre': 'TextePersonne',
  245. },
  246. help_text = {
  247. 'eng': 'Represent a link between someone and a text',
  248. 'fre': 'Représente un lien entre une personne et un texte',
  249. },
  250. group = editorial_person_group,
  251. abstract = True,
  252. parents = entitie,
  253. )
  254. bref_textperson_text = text_person.new_field( 'text',
  255. display_name = {
  256. 'eng': 'Linked text',
  257. 'fre': 'Texte lié',
  258. },
  259. data_handler = 'link',
  260. allowed_classes = [text],
  261. group = editorial_person_group
  262. )
  263. bref_textperson_person = text_person.new_field( 'person',
  264. display_name = {
  265. 'eng': 'Linked person',
  266. 'fre': 'Personne liée',
  267. },
  268. data_handler = 'link',
  269. allowed_classes = [person],
  270. group = editorial_person_group,
  271. )
  272. text_person.new_field( 'role',
  273. display_name = {
  274. 'eng': 'Person role',
  275. 'fre': 'Role de la personne',
  276. },
  277. data_handler = 'varchar',
  278. group = editorial_person_group
  279. )
  280. # simple example of linked text / person
  281. person.new_field( 'linked_texts',
  282. display_name = {
  283. 'eng': 'Linked texts',
  284. 'fre': 'Textes liés',
  285. },
  286. data_handler = 'list',
  287. back_reference = ('Text', 'linked_persons'),
  288. group = editorial_person_group,
  289. allowed_classes = [text],
  290. default = None,
  291. nullable = True)
  292. text.new_field( 'linked_persons',
  293. display_name = {
  294. 'eng': 'Linked persons',
  295. 'fre': 'Personnes liées',
  296. },
  297. data_handler = 'list',
  298. back_reference = ('Person', 'linked_texts'),
  299. group = editorial_person_group,
  300. allowed_classes = [person],
  301. default = None,
  302. nullable = True)
  303. #####################
  304. # Index classes # <--- Note : using a different datasource for testing
  305. ##################### purpose
  306. index_group = em.new_group( 'index_group',
  307. display_name = 'Indexes',
  308. help_text = {
  309. 'eng': 'EM class that represents indexes'},
  310. depends = (editorial_group,))
  311. index_abstract = em.new_class(
  312. 'indexAbs',
  313. display_name = {'eng': 'Abstract Index'},
  314. help_text = {'eng': 'Abstract class common to each Index classes'},
  315. abstract = True,
  316. group = index_group,
  317. datasources = 'dummy2',
  318. parents = em_object)
  319. index_name = index_abstract.new_field(
  320. 'name',
  321. display_name = {
  322. 'eng': 'name',
  323. 'fre': 'nom'},
  324. data_handler = 'varchar',
  325. group = index_group)
  326. index_value = index_abstract.new_field(
  327. 'value',
  328. display_name = {
  329. 'eng': 'value',
  330. 'fre': 'valeur'},
  331. data_handler = 'varchar',
  332. group = index_group)
  333. text.new_field( 'indexes',
  334. display_name = {
  335. 'eng': 'Indexes',
  336. 'fre': 'Indexes'},
  337. data_handler = 'list',
  338. back_reference = ('Indexabs', 'texts'),
  339. allowed_classes = [index_abstract],
  340. default = None,
  341. nullable = True,
  342. group = index_group)
  343. index_abstract.new_field( 'texts',
  344. display_name = {
  345. 'eng': 'Text referenced by this index',
  346. 'fre': 'Texte contenant cette index'},
  347. data_handler = 'list',
  348. back_reference = ('Text', 'indexes'),
  349. allowed_classes = [text],
  350. group = index_group)
  351. index_theme = em.new_class(
  352. 'indexTheme',
  353. display_name = {
  354. 'eng': 'Thematic index',
  355. 'fre': 'Index thématique'},
  356. group = index_group,
  357. datasources = 'dummy2',
  358. parents = index_abstract)
  359. index_theme_theme = index_abstract.new_field(
  360. 'theme',
  361. display_name = {
  362. 'eng': 'theme'},
  363. data_handler = 'varchar',
  364. group = index_group)
  365. #############
  366. # USERS #
  367. #############
  368. user_group = em.new_group(
  369. 'users', display_name = 'Lodel users',
  370. help_text = 'Group that handle users en perm')
  371. user = em.new_class(
  372. 'user', display_name = 'Lodel user', help_text = 'Represent a lodel user',
  373. group = user_group, abstract = False)
  374. user.new_field(
  375. 'id', display_name = 'user identifier', help_text = 'Uniq ID',
  376. group = user_group, data_handler = 'uniqid', internal = True)
  377. user.new_field(
  378. 'firstname', display_name = 'Firstname',
  379. group = user_group, data_handler = 'varchar', internal = False)
  380. user.new_field(
  381. 'lastname', display_name = 'Lastname',
  382. group = user_group, data_handler = 'varchar', internal = False)
  383. user.new_field(
  384. 'login', display_name = 'user login', help_text = 'login',
  385. group = user_group, data_handler = 'varchar', uniq = True, internal = False)
  386. user.new_field(
  387. 'password', display_name = 'Password',
  388. group = user_group, data_handler = 'password', internal = False)
  389. #em.save('xmlfile', filename = 'examples/em_test.xml')
  390. pickle_file = 'examples/em_test.pickle'
  391. em.save('picklefile', filename = pickle_file)
  392. print("Output written in %s" % pickle_file)