diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-08 10:04:23 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-08 10:04:23 +0200 | 
| commit | 770a612b468eebbf85f88ef54d010a35801189b2 (patch) | |
| tree | e375ec41c35c8a24b6883bb0f0b27ced03916f78 /ishtar_common | |
| parent | 36d03c08136e6ff63812cbbc431d06304e7ba156 (diff) | |
| parent | 031e806212ed489f81536103fb7c28e177fb7322 (diff) | |
| download | Ishtar-770a612b468eebbf85f88ef54d010a35801189b2.tar.bz2 Ishtar-770a612b468eebbf85f88ef54d010a35801189b2.zip  | |
Merge branch 'master' into v0.9
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/locale/django.pot | 8 | ||||
| -rw-r--r-- | ishtar_common/static/media/style.css | 18 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/blocks/window_nav.html | 3 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 40 | 
4 files changed, 56 insertions, 13 deletions
diff --git a/ishtar_common/locale/django.pot b/ishtar_common/locale/django.pot index aaae0cf76..771e1f2f2 100644 --- a/ishtar_common/locale/django.pot +++ b/ishtar_common/locale/django.pot @@ -359,7 +359,7 @@ msgstr ""  msgid "Account"  msgstr "" -#: forms_common.py:467 wizards.py:1172 +#: forms_common.py:467 wizards.py:1192  msgid "New password"  msgstr "" @@ -1432,7 +1432,7 @@ msgstr ""  msgid "No"  msgstr "" -#: wizards.py:1229 +#: wizards.py:1249  #, python-format  msgid "[%(app_name)s] Account creation/modification"  msgstr "" @@ -2100,6 +2100,10 @@ msgstr ""  msgid "Export as PDF file"  msgstr "" +#: templates/ishtar/blocks/window_nav.html:49 +msgid "Relation between items are not historized." +msgstr "" +  #: templates/ishtar/blocks/window_tables/documents.html:10  msgid "Related to"  msgstr "" diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css index c6a151dc8..4de3cd315 100644 --- a/ishtar_common/static/media/style.css +++ b/ishtar_common/static/media/style.css @@ -163,6 +163,14 @@ h4{      margin:10px 0;  } +pre { +    padding: 0.5em 1em; +    white-space: pre-wrap; +    white-space: -moz-pre-wrap; +    white-space: -pre-wrap; +    white-space: -o-pre-wrap; +} +  select{      max-width:550px;  } @@ -621,8 +629,8 @@ ul.form-flex li li label {      padding:0.2em;      margin-left:auto;      margin-right:auto; -    width:600px;      background-color:#F1F2F6; +    min-width: 600px;  }  .form table th{ @@ -1090,13 +1098,21 @@ p.alert{      color:#D14;  } +p.info-box{ +    color: #1c94c4; +} +  div.form p.alert{      background-color:#FFF;  } +#window p.info-box,  #window p.alert{      background-color:#EEE; +    padding: 6px 16px;      padding-left: 30px; +    width: auto; +    margin: 6px 10px;  }  #window p.alert label{ diff --git a/ishtar_common/templates/ishtar/blocks/window_nav.html b/ishtar_common/templates/ishtar/blocks/window_nav.html index c225a5822..13069b1eb 100644 --- a/ishtar_common/templates/ishtar/blocks/window_nav.html +++ b/ishtar_common/templates/ishtar/blocks/window_nav.html @@ -45,3 +45,6 @@    <a class='badge' href='{% url show_url item.pk "odt" %}' title='{% trans "Export as OpenOffice.org file"%}'>ODT</a> <a class='badge' href='{% url show_url item.pk "pdf" %}' title='{% trans "Export as PDF file"%}'>PDF</a>  </div>  <hr class='clear'> +{% if next %} +    <p class='info-box'><i class="fa fa-info-circle" aria-hidden="true"></i> <em>{% trans "Relation between items are not historized." %}</em></p> +{% endif %} diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 7fc22f1a9..c8467ca61 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -32,7 +32,7 @@ from django.db.models.fields.files import FileField  from django.db.models.fields.related import ManyToManyField  from django.http import HttpResponseRedirect  from django.forms import ValidationError -from django.shortcuts import render_to_response +from django.shortcuts import render_to_response, redirect  from django.template import Context, RequestContext, loader  from django.utils.datastructures import MultiValueDict as BaseMultiValueDict  from django.utils.translation import ugettext_lazy as _ @@ -557,10 +557,15 @@ class Wizard(NamedUrlWizardView):          m2m_items = {}          # clear          # TODO! perf - to be really optimized +        old_m2ms = {}          for model in whole_associated_models:              related_model = getattr(obj, model + 's')              # clear real m2m              if hasattr(related_model, 'clear'): +                old_m2ms[model] = [] +                # stock items in order to not recreate them +                for old_item in related_model.all(): +                    old_m2ms[model].append(old_item)                  related_model.clear()              else:                  for r in related_model.all(): @@ -581,16 +586,32 @@ class Wizard(NamedUrlWizardView):              if value not in m2m_items[key]:                  if type(value) == dict:                      model = related_model.model -                    if issubclass(model, models.BaseHistorizedItem): -                        value['history_modifier'] = self.request.user                      # not m2m -> foreign key                      if not hasattr(related_model, 'clear'):                          assert hasattr(model, 'MAIN_ATTR'), \                              u"Must define a MAIN_ATTR for " + \                              unicode(model.__class__)                          value[getattr(model, 'MAIN_ATTR')] = obj -                    value = model.objects.create(**value) -                    value.save() + +                    # check old links +                    my_old_item = None +                    if key in old_m2ms: +                        for old_item in old_m2ms[key]: +                            is_ok = True +                            for k in value: +                                if is_ok and getattr(old_item, k) != value[k]: +                                    is_ok = False +                                    continue +                            if is_ok: +                                my_old_item = old_item +                                break +                    if my_old_item: +                        value = my_old_item +                    else: +                        if issubclass(model, models.BaseHistorizedItem): +                            value['history_modifier'] = self.request.user +                        value = model.objects.create(**value) +                        value.save()                  # check that an item is not add multiple times (forged forms)                  if value not in related_model.all() and\                          hasattr(related_model, 'add'): @@ -632,7 +653,7 @@ class Wizard(NamedUrlWizardView):          return (to_delete, not_to_delete)      def get_form(self, step=None, data=None, files=None): -        """Manage formset""" +        # Manage formset          if data:              data = data.copy()              if not step: @@ -695,6 +716,7 @@ class Wizard(NamedUrlWizardView):                  #    for k in init[0]:                  #        data[step + '-' + unicode(total_field) + '-' + k] = \                  #                                                      init[0][k] +          data = data or None          form = super(Wizard, self).get_form(step, data, files)          # add autofocus to first field @@ -723,6 +745,7 @@ class Wizard(NamedUrlWizardView):                      if frm.fields[key].widget.source_full is not None:                          frm.fields[key].widget.source_full = unicode(                              frm.fields[key].widget.source_full) + "own/" +          return form      def render_next_step(self, form, **kwargs): @@ -760,10 +783,7 @@ class Wizard(NamedUrlWizardView):          except (ValueError, IndexError):              return super(Wizard, self).post(*args, **kwargs)          self.storage.current_step = wizard_goto_step -        form = self.get_form( -            data=self.storage.get_step_data(self.steps.current), -            files=self.storage.get_step_files(self.steps.current)) -        return self.render(form) +        return redirect(self.get_step_url(wizard_goto_step))      def session_get_keys(self, form_key):          """Get list of available keys for a specific form  | 
