1
0
Fork 0
mirror of https://github.com/yweber/lodel2.git synced 2026-03-17 08:42:01 +01:00
lodel2_mirror/EditorialModel/fieldgroups.py

70 lines
2.9 KiB
Python

#-*- coding: utf-8 -*-
from EditorialModel.components import EmComponent
from EditorialModel.fields import EmField
from EditorialModel.classes import EmClass
from EditorialModel.exceptions import EmComponentCheckError
## Represents groups of EmField associated with an EmClass
#
# EmClass fields representation is organised with EmFieldGroup
# @see EditorialModel::fields::EmField EditorialModel::classes::EmClass
class EmFieldGroup(EmComponent):
ranked_in = 'class_id'
## EmFieldGroup instanciation
def __init__(self, model, uid, name, class_id, string=None, help_text=None, date_update=None, date_create=None, rank=None):
self.class_id = class_id
self.check_type('class_id', int)
super(EmFieldGroup, self).__init__(model=model, uid=uid, name=name, string=string, help_text=help_text, date_update=date_update, date_create=date_create, rank=rank)
@property
def em_class(self):
return self.model.component(self.class_id)
## Check if the EmFieldGroup is valid
# @throw EmComponentCheckError if fails
def check(self):
super(EmFieldGroup, self).check()
em_class = self.model.component(self.class_id)
if not em_class:
raise EmComponentCheckError("class_id contains a non existing uid '%s'" % str(self.class_id))
if not isinstance(em_class, EmClass):
raise EmComponentCheckError("class_id cointains an uid from a component that is not an EmClass but an %s" % type(em_class))
## Deletes a fieldgroup
# @return True if the deletion is possible, False if not
def delete_check(self):
# all the EmField objects contained in this fieldgroup should be deleted first
fieldgroup_fields = self.fields()
if len(fieldgroup_fields) > 0:
raise NotEmptyError("This Fieldgroup still contains fields. It can't be deleted then")
return True
## Get the list of associated fields
# if type_id, the fields will be filtered to represent selected fields of this EmType
# @return A list of EmField instance
def fields(self, type_id=0):
if not type_id:
fields = [field for field in self.model.components(EmField) if field.fieldgroup_id == self.uid]
else:
# for an EmType, fields have to be filtered
em_type = self.model.component(type_id)
fields = []
for field in self.model.components(EmField):
if field.fieldgroup_id != self.uid or (field.optional and field.uid not in em_type.fields_list):
continue
# don't include relational field if parent should not be included
if field.rel_field_id:
parent = self.model.component(field.rel_field_id)
if parent.optional and parent.uid not in em_type.fields_list:
continue
fields.append(field)
return fields
class NotEmptyError(Exception):
pass