diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/models.py | 117 | ||||
| -rw-r--r-- | ishtar_common/models_imports.py | 7 | 
2 files changed, 93 insertions, 31 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 94d8744e5..f4d898dc5 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -42,6 +42,7 @@ from ooopy.OOoPy import OOoPy  from ooopy.Transformer import Transformer as OOTransformer  import ooopy.Transforms as OOTransforms  import uuid +import zipfile  from django import forms  from django.apps import apps @@ -93,7 +94,7 @@ from ishtar_common.models_imports import ImporterModel, ImporterType, \  from ishtar_common.templatetags.link_to_window import simple_link_to_window  from ishtar_common.utils import get_cache, disable_for_loaddata, create_slug, \      get_all_field_names, merge_tsvectors, cached_label_changed, post_save_geo, \ -    generate_relation_graph, max_size_help, task, SecretaryRenderer +    generate_relation_graph, max_size_help, task  __all__ = [      'ImporterModel', 'ImporterType', 'ImporterDefault', 'ImporterDefaultValues', @@ -136,25 +137,38 @@ class ValueGetter(object):      GET_VALUES_EXTRA_TYPES = [          'preservation_to_considers', 'alterations', 'alteration_causes'] -    def _get_values_documents(self, prefix=""): +    def _get_values_documents(self, prefix="", filtr=None):          values = {}          if not hasattr(self, 'documents'):              return values -        values[prefix + "documents"] = [ -            doc.get_values(no_values=True) -            for doc in self.documents.all() -        ] +        if not filtr or prefix + "documents" in filtr: +            values[prefix + "documents"] = [ +                doc.get_values(no_values=True) +                for doc in self.documents.all() +            ] +        if filtr and prefix + "main_image" not in filtr: +            return values          if hasattr(self, "main_image") and self.main_image and hasattr(                  self.main_image, "get_values"):              values[prefix + "main_image"] = self.main_image.get_values(                  no_values=True)          return values -    def get_values(self, prefix='', no_values=False): +    def _get_values_update_sub_filter(self, filtr, prefix): +        if not filtr: +            return +        new_filtr = [] +        for k in filtr: +            if k.startswith(prefix): +                new_filtr.append(k[len(prefix):]) +        return new_filtr + +    def get_values(self, prefix='', no_values=False, filtr=None, **kwargs):          if not prefix:              prefix = self._prefix          values = {} -        if hasattr(self, "qrcode"): +        if hasattr(self, "qrcode") and (not filtr +                                        or 'qrcode_path' in filtr):              values['qrcode_path'] = self.qrcode_path          for field_name in get_all_field_names(self):              try: @@ -163,15 +177,27 @@ class ValueGetter(object):                  continue              if field_name in self.GET_VALUES_EXCLUDE_FIELDS:                  continue +            if filtr and prefix + field_name not in filtr: +                if hasattr(value, 'get_values'): +                    new_prefix = prefix + field_name + '_' +                    new_filtr = self._get_values_update_sub_filter(filtr, +                                                                   new_prefix) +                    values.update( +                        value.get_values(new_prefix, filtr=new_filtr, **kwargs)) +                continue              if hasattr(self, "get_values_for_" + field_name):                  values[prefix + field_name] = getattr(                      self, "get_values_for_" + field_name)()              else:                  if hasattr(value, 'get_values'): -                    values.update(value.get_values(prefix + field_name + '_')) +                    new_prefix = prefix + field_name + '_' +                    new_filtr = self._get_values_update_sub_filter(filtr, +                                                                   new_prefix) +                    values.update( +                        value.get_values(new_prefix, filtr=new_filtr, **kwargs))                  else:                      values[prefix + field_name] = value -        values.update(self._get_values_documents(prefix=prefix)) +        values.update(self._get_values_documents(prefix=prefix, filtr=filtr))          for extra_field in self.GET_VALUES_EXTRA:              values[prefix + extra_field] = getattr(self, extra_field) or ''          for key in values.keys(): @@ -3645,6 +3671,23 @@ class DocumentTemplate(models.Model):              output.write(result)          return output_name +    def get_filter(self, template, regexp_list=None): +        if not regexp_list: +            return None +        z = zipfile.ZipFile(template) +        content = z.open('content.xml') +        full_content = content.read().decode("utf-8") +        filtr = [] +        for regexp in regexp_list: +            iter = re.finditer( +                regexp, +                full_content) +            for s in iter: +                key = s.groups()[0] +                if key not in filtr: +                    filtr.append(key) +        return filtr +      def publish_labels(self, objects):          if not objects:              return @@ -3655,6 +3698,13 @@ class DocumentTemplate(models.Model):          suffix = "." + self.template.name.split('.')[-1]          len_objects = len(objects)          names = [] + +        filtr = self.get_filter( +            self.template, +            # e.g.: {{items.4.key}} +            [r'{{ *items\.\d\.([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *}}'] +        ) +          for idx in range(int(len(objects) / self.label_per_page) + 1):              if idx * self.label_per_page >= len_objects:                  break @@ -3664,7 +3714,7 @@ class DocumentTemplate(models.Model):                  if c_idx >= len_objects:                      break                  obj = objects[c_idx] -                values["items"].append(obj.get_values()) +                values["items"].append(obj.get_values(filtr=filtr))              engine = IshtarSecretaryRenderer()              try:                  result = engine.render(self.template, **values) @@ -3808,12 +3858,18 @@ class Town(Imported, models.Model):                    'year': self.year or ""}          return values -    def get_values(self, prefix='', no_values=False, no_base_finds=True): -        return { -            prefix or "label": str(self), -            prefix + "name": self.name, -            prefix + "numero_insee": self.numero_insee -        } +    def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): +        values = {} +        if not filtr or prefix in filtr or "label" in filtr: +            if prefix: +                values[prefix] = str(self) +            else: +                values['label'] = str(self) +        if not filtr or prefix + "name" in filtr: +            values[prefix + "name"] = self.name +        if not filtr or prefix + "numero_insee" in filtr: +            values[prefix + "numero_insee"] = self.numero_insee +        return values      @classmethod      def history_decompress(cls, full_value, create=False): @@ -4579,9 +4635,9 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem):              values.append(attached_to)          return " ".join(values) -    def get_values(self, prefix='', no_values=False): -        values = super(Person, self).get_values(prefix=prefix, -                                                no_values=no_values) +    def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): +        values = super(Person, self).get_values( +            prefix=prefix, no_values=no_values, filtr=filtr, **kwargs)          if not self.attached_to:              values.update(                  Person.get_empty_values(prefix=prefix + 'attached_to_')) @@ -5051,10 +5107,11 @@ class Basket(FullSearch, OwnPerms, ValueGetter, TemplateItem):          return Q(user=ishtaruser) | Q(              shared_write_with=ishtaruser) -    def get_values(self, prefix='', no_values=False): -        values = super(Basket, self).get_values(prefix=prefix, -                                                no_values=no_values) -        values["items"] = [item.get_values() for item in self.items.all()] +    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): @@ -5552,11 +5609,13 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,              return ""          return self.image.path -    def get_values(self, prefix="", no_values=False): -        values = super(Document, self).get_values(prefix=prefix, -                                                  no_values=no_values) -        values[prefix + "image_path"] = self.image_path -        values[prefix + "thumbnail_path"] = self.thumbnail_path +    def get_values(self, prefix="", no_values=False, filtr=None, **kwargs): +        values = super(Document, self).get_values( +            prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) +        if not filtr or prefix + "image_path" in filtr: +            values[prefix + "image_path"] = self.image_path +        if not filtr or prefix + "thumbnail_path" in filtr: +            values[prefix + "thumbnail_path"] = self.thumbnail_path          return values      @property diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 5712a1936..42ab7f9ea 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -48,6 +48,10 @@ from ishtar_common.data_importer import Importer, ImportFormater, \      ImporterError  from ishtar_common.utils import task +UnoCalc = None +if settings.USE_LIBREOFFICE: +    from ishtar_common.libreoffice import UnoCalc +  logger = logging.getLogger(__name__) @@ -127,9 +131,8 @@ class ImporterType(models.Model):          return self.name      def get_libreoffice_template(self): -        if not settings.USE_LIBREOFFICE: +        if not UnoCalc:              return -        from ishtar_common.libreoffice import UnoCalc          ROW_NUMBER = 500          uno = UnoCalc()          calc = uno.create_calc()  | 
