diff options
-rw-r--r-- | archaeological_files/models.py | 2 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 12 | ||||
-rw-r--r-- | archaeological_finds/tests.py | 67 | ||||
-rw-r--r-- | archaeological_operations/tests.py | 2 | ||||
-rwxr-xr-x | archaeological_operations/tests/document_reference.odt | bin | 11155 -> 9551 bytes | |||
-rw-r--r-- | archaeological_warehouse/models.py | 12 | ||||
-rw-r--r-- | ishtar_common/models.py | 66 |
7 files changed, 125 insertions, 36 deletions
diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 8f27f7ec2..6478dfeaa 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -372,7 +372,7 @@ class File(ClosedItem, DocumentItem, BaseHistorizedItem, CompleteIdentifierItem, imported_line = models.TextField(_("Imported line"), blank=True, default="") history = HistoricalRecords(bases=[HistoryModel]) - GET_VALUES_EXTRA = [ + GET_VALUES_EXTRA = ValueGetter.GET_VALUES_EXCLUDE_FIELDS + [ 'general_contractor_address_1', 'general_contractor_address_2', 'general_contractor_address_3', diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index c7065166e..bab3dae9f 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -712,11 +712,15 @@ class FindBasket(Basket, MainItem, ValueGetter): ) def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): + base_exclude = kwargs["exclude"][:] if "exclude" in kwargs else [] + base_exclude.append(prefix + "items") + kw = kwargs.copy() + kw["exclude"] = base_exclude values = super(FindBasket, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) + prefix=prefix, no_values=no_values, filtr=filtr, **kw) if not filtr or prefix + "items" in filtr: values[prefix + "items"] = [ - item.get_values(no_values=True, filtr=None, **kwargs) + item.get_values(no_values=True, filtr=filtr, **kwargs) for item in self.items.distinct().all() ] return values @@ -1529,11 +1533,11 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, 'remarkabilities', 'communicabilities', 'preservation_to_considers', 'alterations', 'alteration_causes', "cultural_attributions" ] - GET_VALUES_EXTRA_TYPES = ( + GET_VALUES_EXTRA_TYPES = ValueGetter.GET_VALUES_EXCLUDE_FIELDS + [ 'material_types', 'object_types', 'integrities', 'remarkabilities', 'communicabilities', 'preservation_to_considers', 'alterations', 'alteration_causes' - ) + ] CACHED_LABELS = ['cached_label', 'cached_periods', 'cached_object_types', 'cached_materials'] objects = UUIDModelManager() diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 2ef551253..bede89b51 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -49,8 +49,7 @@ from archaeological_context_records.models import Period, Dating, \ ContextRecord, DatingType, DatingQuality from archaeological_finds import models, views from archaeological_warehouse.models import Warehouse, WarehouseType, \ - ContainerType, Container, WarehouseDivision, WarehouseDivisionLink, \ - ContainerLocalisation + ContainerType, Container, WarehouseDivisionLink from archaeological_operations.models import Operation, OperationType from ishtar_common import forms_common @@ -2579,3 +2578,67 @@ class LabelTest(FindInit, TestCase): self.templates.append(doc.template.path) else: self.assertFalse(doc.template.name, msg=msg) + + +class TemplateTest(FindInit, TestCase): + fixtures = FIND_FIXTURES + model = models.Find + + def setUp(self): + template = settings.ROOT_PATH + \ + '../archaeological_finds/tests/notices-panier.odt' + filename = template.split("/")[-1] + shutil.copy(template, + os.path.join(settings.MEDIA_ROOT, filename), + follow_symlinks=True) + self.template = os.path.join(settings.MEDIA_ROOT, filename) + self.templates = [self.template] + ope1 = self.create_operation()[0] + ope2 = self.create_operation()[1] + cr = self.create_context_record( + data={"label": "CR 1", "operation": ope1} + )[0] + cr2 = self.create_context_record( + data={"label": "CR 2", "operation": ope2} + )[1] + self.create_finds(data_base={"context_record": cr})[0] + self.create_finds(data_base={"context_record": cr2})[1] + self.basket = models.FindBasket.objects.create(label="Hophop") + self.basket.items.add(self.finds[0]) + self.basket.items.add(self.finds[1]) + wt, __ = WarehouseType.objects.get_or_create(label="WT", txt_idx="WT") + location = Warehouse.objects.create(name="Warehouse", warehouse_type=wt) + ct, __ = ContainerType.objects.get_or_create(label="CT", txt_idx="CT") + self.container = Container.objects.create( + location=location, + reference="Reférence", + container_type=ct + ) + + def test_label(self): + with open(self.template, 'rb') as tpl: + template = SimpleUploadedFile("template.odt", + tpl.read()) + model, __ = ImporterModel.objects.get_or_create( + klass='archaeological_finds.models.Find' + ) + q = DocumentTemplate.objects.filter(slug="test") + if q.count(): + q.all()[0].delete() + doc = DocumentTemplate.objects.create( + name="Test", + slug="test", + associated_model=model, + available=True, + template=template) + self.templates.append(doc.template.path) + doc = DocumentTemplate.objects.get(pk=doc.pk) + + result = doc.publish(self.basket) + if result: + self.templates.append(result) + + def tearDown(self): + for tpl in self.templates: + if os.path.exists(tpl): + os.remove(tpl) diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 287b01013..d8c61c642 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -2562,7 +2562,7 @@ class RegisterTest(TestCase, OperationInitTest): self.act_types, self.admin_acts = create_administrativact( self.user, self.operations[0]) - def testSearch(self): + def test_search(self): c = Client() response = c.get(reverse('get-administrativeact'), {'year': '2014'}) # no result when no authentication diff --git a/archaeological_operations/tests/document_reference.odt b/archaeological_operations/tests/document_reference.odt Binary files differindex 0097e8b15..c1b43053f 100755 --- a/archaeological_operations/tests/document_reference.odt +++ b/archaeological_operations/tests/document_reference.odt diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 06c7cdcd8..cb144270b 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -651,6 +651,9 @@ class Container(DocumentItem, Merge, LightHistorizedItem, STATISTIC_MODALITIES = [ key for key, lbl in STATISTIC_MODALITIES_OPTIONS.items()] + GET_VALUES_EXCLUDE_FIELDS = ValueGetter.GET_VALUES_EXCLUDE_FIELDS + [ + "inside_container", "parent"] + # search parameters EXTRA_REQUEST_KEYS = { 'location': 'location__pk', @@ -1341,16 +1344,17 @@ class Container(DocumentItem, Merge, LightHistorizedItem, def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): values = super(Container, self).get_values( prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) - if (not filtr or prefix + 'finds' in filtr) and ( - not prefix.startswith("container_") and not - prefix.startswith("container_ref_")): + from_find = prefix.startswith("container_") or \ + prefix.startswith("container_ref_") + if (not filtr or prefix + 'finds' in filtr) and not from_find: kwargs["exclude"] = [prefix + "container", prefix + "container_ref"] # prevent recursive call values[prefix + 'finds'] = [ f.get_values( prefix=prefix, no_values=True, filtr=None, **kwargs) for f in self.finds.distinct().all()] - if (not filtr or prefix + 'operation' in filtr or + if not from_find and ( + not filtr or prefix + 'operation' in filtr or prefix + "context_record" in filtr) and self.finds.count(): # assume that only one operation is in this container # you should know what you are doing when using theses variables diff --git a/ishtar_common/models.py b/ishtar_common/models.py index bf8c8c19c..2df42bc05 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -174,16 +174,17 @@ class ValueGetter(object): value = getattr(self, field_name) except (AttributeError, MultipleObjectsReturned): continue - if field_name in self.GET_VALUES_EXCLUDE_FIELDS: + if field_name in self.GET_VALUES_EXCLUDE_FIELDS or \ + prefix + field_name in exclude: continue - if prefix + field_name in exclude: + if filtr and not any( + field_name for f in filtr + if f.startswith(prefix + field_name)): continue if hasattr(value, 'get_values'): new_prefix = prefix + field_name + '_' values.update( value.get_values(new_prefix, filtr=filtr, **kwargs)) - if filtr and prefix + field_name not in filtr: - continue if hasattr(self, "get_values_for_" + field_name): values[prefix + field_name] = getattr( self, "get_values_for_" + field_name)() @@ -1575,19 +1576,22 @@ class DocumentTemplate(models.Model): slugify(self.name.replace(' ', '_').lower()) + '-' + \ datetime.date.today().strftime('%Y-%m-%d') + \ "." + self.template.name.split('.')[-1] - """ - # to be tested + item_re = r"([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)*[|]*" filtr = self.get_filter( self.template, - [r'{{ *([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *}}', - r'{% *for +[A-Za-z0-9_]+ +in +' - r'([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *%}', - r'{% *if +([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *%}', - ] + [ + # {{ key1.key2 }} + r'{{ *' + item_re + ' *}}', + # {% for item in key1.key2 %} + r'{% *for +[A-Za-z0-9_]+ +in +' + item_re + r' *%}', + # {% if ** %} + r'{% (?:el)*if ([^}]*)%}', + ] ) - """ - filtr = [] - values = c_object.get_values() + # values = c_object.get_values(filtr=[]) + if "VALUES" in filtr: + filtr = [] + values = c_object.get_values(filtr=filtr) if not filtr or 'VALUES' in filtr: values['VALUES'] = json.dumps( values, indent=4, sort_keys=True, @@ -1624,16 +1628,37 @@ class DocumentTemplate(models.Model): filtr.append(key) new_filter = [] for fil in filtr: - keys = fil.split('.') + if not fil: + continue + new_filter += [f for f in fil.split(" ") + if f and f not in ( + "==", "not", "in", ">", "<", "!=", + ">", "<", ">=", "<=", "or", ">=", + "<=" + )] + filtr = new_filter + new_filter = [] + for fil in filtr: + if not fil or fil in ("in", "not", "el") or fil.startswith("|"): + continue + try: + int(fil) + continue + except ValueError: # not a single int + pass + keys = fil.split("|")[0].split('.') + new_filter += keys prefix = "" for k in keys: + if not k: + continue if prefix: prefix += '_' if prefix + k in new_filter: continue new_filter.append(prefix + k) prefix += k - return new_filter + return list(set(new_filter)) def publish_labels(self, objects): if not objects: @@ -1653,7 +1678,7 @@ class DocumentTemplate(models.Model): # {{items.4.key}} r'{{ *' + item_re + r' *}}', # {% if items.42.other_key %} - r'{% *if ' + item_re + r' *%}', + r'{% *(el)*if ' + item_re + r' *%}', # {% for item in items.42.another_keys %} r'{% *for +[A-Za-z0-9_]+ +in +' + item_re + r' *%}', ] @@ -2666,13 +2691,6 @@ class Basket(FullSearch, OwnPerms, ValueGetter, TemplateItem): return Q(user=ishtaruser) | Q( shared_write_with=ishtaruser) - def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): - values = super(Basket, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) - if not filtr or "items" in filtr: - values["items"] = [item.get_values() for item in self.items.all()] - return values - def duplicate(self, label=None, ishtaruser=None): """ Duplicate the basket. Items in basket are copied but not shared users |