diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-06-24 14:37:16 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-06-24 14:37:16 +0200 | 
| commit | 05c6d94c9547377c9979e9d860c6618ee898ef6e (patch) | |
| tree | 6b4fc14f42da9d91ab2bb4b989ffeeb42947392f | |
| parent | 2d008477cb66ec3e356fd9153afba7affede249c (diff) | |
| download | Ishtar-05c6d94c9547377c9979e9d860c6618ee898ef6e.tar.bz2 Ishtar-05c6d94c9547377c9979e9d860c6618ee898ef6e.zip | |
Sources creation for Operation (refs #497) - restructuration (refs #57)
| -rw-r--r-- | ishtar/__init__.py | 1 | ||||
| -rw-r--r-- | ishtar/ishtar_base/__init__.py (renamed from ishtar/furnitures/__init__.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/admin.py (renamed from ishtar/furnitures/admin.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/backend.py (renamed from ishtar/furnitures/backend.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/context_processors.py (renamed from ishtar/furnitures/context_processors.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/fixtures/organization_type-fr.json (renamed from ishtar/furnitures/fixtures/organization_type-fr.json) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/fixtures/person_type-fr.json (renamed from ishtar/furnitures/fixtures/person_type-fr.json) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/fixtures/treatment_type-fr.json (renamed from ishtar/furnitures/fixtures/treatment_type-fr.json) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/fixtures/user.json (renamed from ishtar/furnitures/fixtures/user.json) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms.py (renamed from ishtar/furnitures/forms.py) | 65 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms_common.py (renamed from ishtar/furnitures/forms_common.py) | 90 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms_context_records.py (renamed from ishtar/furnitures/forms_context_records.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms_files.py (renamed from ishtar/furnitures/forms_files.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms_items.py (renamed from ishtar/furnitures/forms_items.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms_main.py (renamed from ishtar/furnitures/forms_main.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/forms_operations.py (renamed from ishtar/furnitures/forms_operations.py) | 35 | ||||
| -rw-r--r-- | ishtar/ishtar_base/menus.py (renamed from ishtar/furnitures/menus.py) | 9 | ||||
| -rw-r--r-- | ishtar/ishtar_base/models.py (renamed from ishtar/furnitures/models.py) | 2 | ||||
| -rw-r--r-- | ishtar/ishtar_base/templatetags/__init__.py (renamed from ishtar/furnitures/templatetags/__init__.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/templatetags/range.py (renamed from ishtar/furnitures/templatetags/range.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/templatetags/table_form.py (renamed from ishtar/furnitures/templatetags/table_form.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/tests.py (renamed from ishtar/furnitures/tests.py) | 0 | ||||
| -rw-r--r-- | ishtar/ishtar_base/urls.py (renamed from ishtar/furnitures/urls.py) | 8 | ||||
| -rw-r--r-- | ishtar/ishtar_base/views.py (renamed from ishtar/furnitures/views.py) | 44 | ||||
| -rw-r--r-- | ishtar/ishtar_base/widgets.py (renamed from ishtar/furnitures/widgets.py) | 0 | ||||
| -rwxr-xr-x | ishtar/scripts/import_from_csv.py | 2 | ||||
| -rwxr-xr-x | ishtar/scripts/import_towns_from_osm.py | 2 | ||||
| -rw-r--r-- | ishtar/settings.py.example | 6 | ||||
| -rw-r--r-- | ishtar/urls.py | 4 | 
29 files changed, 200 insertions, 68 deletions
| diff --git a/ishtar/__init__.py b/ishtar/__init__.py index c6c05bd5c..a23b98e09 100644 --- a/ishtar/__init__.py +++ b/ishtar/__init__.py @@ -7,6 +7,7 @@ _(u"New warehouse")  _(u"warehouse")  _(u"New organization")  _(u"New person") +_(u"New author")  if settings.XHTML2ODT_PATH:      import sys      sys.path.append(settings.XHTML2ODT_PATH) diff --git a/ishtar/furnitures/__init__.py b/ishtar/ishtar_base/__init__.py index e69de29bb..e69de29bb 100644 --- a/ishtar/furnitures/__init__.py +++ b/ishtar/ishtar_base/__init__.py diff --git a/ishtar/furnitures/admin.py b/ishtar/ishtar_base/admin.py index 3a93f1852..3a93f1852 100644 --- a/ishtar/furnitures/admin.py +++ b/ishtar/ishtar_base/admin.py diff --git a/ishtar/furnitures/backend.py b/ishtar/ishtar_base/backend.py index f50edd708..f50edd708 100644 --- a/ishtar/furnitures/backend.py +++ b/ishtar/ishtar_base/backend.py diff --git a/ishtar/furnitures/context_processors.py b/ishtar/ishtar_base/context_processors.py index c4eb546f3..c4eb546f3 100644 --- a/ishtar/furnitures/context_processors.py +++ b/ishtar/ishtar_base/context_processors.py diff --git a/ishtar/furnitures/fixtures/organization_type-fr.json b/ishtar/ishtar_base/fixtures/organization_type-fr.json index c25bd8179..c25bd8179 100644 --- a/ishtar/furnitures/fixtures/organization_type-fr.json +++ b/ishtar/ishtar_base/fixtures/organization_type-fr.json diff --git a/ishtar/furnitures/fixtures/person_type-fr.json b/ishtar/ishtar_base/fixtures/person_type-fr.json index 0613b3129..0613b3129 100644 --- a/ishtar/furnitures/fixtures/person_type-fr.json +++ b/ishtar/ishtar_base/fixtures/person_type-fr.json diff --git a/ishtar/furnitures/fixtures/treatment_type-fr.json b/ishtar/ishtar_base/fixtures/treatment_type-fr.json index f39f72059..f39f72059 100644 --- a/ishtar/furnitures/fixtures/treatment_type-fr.json +++ b/ishtar/ishtar_base/fixtures/treatment_type-fr.json diff --git a/ishtar/furnitures/fixtures/user.json b/ishtar/ishtar_base/fixtures/user.json index c2486d47d..c2486d47d 100644 --- a/ishtar/furnitures/fixtures/user.json +++ b/ishtar/ishtar_base/fixtures/user.json diff --git a/ishtar/furnitures/forms.py b/ishtar/ishtar_base/forms.py index 3d663d089..29d9ab4d6 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/ishtar_base/forms.py @@ -48,24 +48,6 @@ from ishtar import settings  reverse_lazy = lazy(reverse, unicode) -def clean_duplicated(formset, key_names): -    """Checks for duplicated.""" -    if any(formset.errors): -        return -    items = [] -    for i in range(0, formset.total_form_count()): -        form = formset.forms[i] -        if not form.is_valid(): -            continue -        item = [key_name in form.cleaned_data and form.cleaned_data[key_name] -                for key_name in key_names] -        if not [v for v in item if v]: -            continue -        if item in items: -            raise forms.ValidationError, \ -                  _("There are identical items.") -        items.append(item) -  regexp_name = re.compile(r'^[\w\- ]+$', re.UNICODE)  name_validator = validators.RegexValidator(regexp_name,  _(u"Enter a valid name consisting of letters, spaces and hyphens."), 'invalid') @@ -81,9 +63,28 @@ class FloatField(forms.FloatField):  class FinalForm(forms.Form):      final = True -    form_label = _("Confirm") +    form_label = _(u"Confirm")  class FormSet(BaseFormSet): +    def check_duplicate(self, key_names, error_msg=""): +        """Check for duplicate items in the formset""" +        if any(self.errors): +            return +        if not error_msg: +            error_msg = _("There are identical items.") +        items = [] +        for i in range(0, self.total_form_count()): +            form = self.forms[i] +            if not form.is_valid(): +                continue +            item = [key_name in form.cleaned_data and form.cleaned_data[key_name] +                    for key_name in key_names] +            if not [v for v in item if v]: +                continue +            if item in items: +                raise forms.ValidationError, error_msg +            items.append(item) +      def add_fields(self, form, index):          super(FormSet, self).add_fields(form, index)          form.fields[DELETION_FIELD_NAME].label = '' @@ -707,3 +708,29 @@ class ClosingWizard(Wizard):          return render_to_response('wizard_closing_done.html', {},                                    context_instance=RequestContext(request)) +def get_form_selection(class_name, label, key, model, base_form, get_url, +                       not_selected_error=_(u"You should select an item.")): +    """ +    Generate a class selection form +        class_name -- name of the class +        label -- label of the form +        key -- model, +        base_form -- base form to select +        get_url -- url to get the item +        not_selected_error -- message displayed when no item is selected +    """ +    attrs = {'_main_key':key, +             '_not_selected_error':not_selected_error, +             'form_label':label, +             'associated_models':{key:model}, +             'currents':{key:model},} +    attrs[key] = forms.IntegerField(label="", required=False, +                       widget=widgets.JQueryJqGrid(reverse_lazy(get_url), +                       base_form(), model), validators=[models.valid_id(model)]) +    def clean(self): +        cleaned_data = self.cleaned_data +        if self._main_key not in cleaned_data \ +           or not cleaned_data[self._main_key]: +            raise forms.ValidationError(self._not_selected_error) +        return cleaned_data +    return type(class_name, (forms.Form,), attrs) diff --git a/ishtar/furnitures/forms_common.py b/ishtar/ishtar_base/forms_common.py index 2082cd2b7..aff263a3b 100644 --- a/ishtar/furnitures/forms_common.py +++ b/ishtar/ishtar_base/forms_common.py @@ -38,8 +38,7 @@ from ishtar import settings  import models  import widgets -from forms import Wizard, FinalForm, FormSet, reverse_lazy, name_validator,\ -                  clean_duplicated +from forms import Wizard, FinalForm, FormSet, reverse_lazy, name_validator  def get_town_field(required=True):      help_text = _(u"<p>Type name, department code and/or postal code of the " @@ -48,6 +47,7 @@ def get_town_field(required=True):      u"department code is generally sufficient to get the appropriate result.</p>"      u"\n<p class='example'>For instance type \"saint denis 93\" for getting "      u"the french town Saint-Denis in the Seine-Saint-Denis department.</p>") +    # !FIXME hard_link, reverse_lazy doen't seem to work with formsets      return forms.IntegerField(           widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \                       'autocomplete-town', associated_model=models.Town), @@ -338,25 +338,13 @@ account_management_wizard = AccountWizard([  class TownForm(forms.Form):      form_label = _("Towns")      associated_models = {'town':models.Town} -    # !FIXME hard_link, reverse_lazy doen't seem to work with formsets      town = get_town_field(required=False)  class TownFormSet(FormSet):      def clean(self):          """Checks that no towns are duplicated.""" -        if any(self.errors): -            return -        towns = [] -        for i in range(0, self.total_form_count()): -            form = self.forms[i] -            if not form.is_valid(): -                continue -            if 'town' not in form.cleaned_data or not form.cleaned_data['town']: -                continue -            town = form.cleaned_data['town'] -            if town in towns: -                raise forms.ValidationError, _("There are identical towns.") -            towns.append(town) +        return self.check_duplicate(('town',), +                                    _("There are identical towns."))  TownFormSet = formset_factory(TownForm, can_delete=True, formset=TownFormSet)  TownFormSet.form_label = _("Towns") @@ -406,8 +394,74 @@ class ParcelForm(forms.Form):  class ParcelFormSet(FormSet):      def clean(self):          """Checks that no parcels are duplicated.""" -        return clean_duplicated(self, ('town', 'parcel_number', 'year')) +        return self.check_duplicate(('town', 'parcel_number', 'year'), +                                    _(u"There are identical parcels."))  ParcelFormSet = formset_factory(ParcelForm, can_delete=True,                                  formset=ParcelFormSet) -ParcelFormSet.form_label = _("Parcels") +ParcelFormSet.form_label = _(u"Parcels") + +# sources management + +class SourceWizard(Wizard): +    model = None +    def get_extra_model(self, dct, request, storage, form_list): +        dct = super(SourceWizard, self).get_extra_model(dct, request, storage, +                                                        form_list) +        if 'history_modifier' in dct: +            dct.pop('history_modifier') +        return dct + +class SourceForm(forms.Form): +    form_label = _(u"Documentation informations") +    associated_models = {'source_type':models.SourceType} +    title = forms.CharField(label=_(u"Title"), +                            validators=[validators.MaxLengthValidator(200)]) +    source_type = forms.ChoiceField(label=_(u"Source type"), choices=[]) + +    def __init__(self, *args, **kwargs): +        super(SourceForm, self).__init__(*args, **kwargs) +        self.fields['source_type'].choices = models.SourceType.get_types() + +class AuthorForm(forms.Form): +    form_label = _(u"Author") +    associated_models = {'person':models.Person, +                         'author_type':models.AuthorType} +    person = forms.IntegerField( +         widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \ +               'autocomplete-person', associated_model=models.Person, new=True), +         validators=[models.valid_id(models.Person)], label=_(u"Person")) +    author_type = forms.ChoiceField(label=_(u"Author type"), choices=[]) + +    def __init__(self, *args, **kwargs): +        super(AuthorForm, self).__init__(*args, **kwargs) +        self.fields['author_type'].choices = models.AuthorType.get_types() + +    def save(self, user): +        dct = self.cleaned_data +        dct['author_type'] = models.AuthorType.objects.get( +                                                     pk=dct['author_type']) +        dct['person'] = models.Person.objects.get(pk=dct['person']) +        new_item = models.Author(**dct) +        new_item.save() +        return new_item + + +class AuthorFormSelection(forms.Form): +    form_label = _(u"Author selection") +    associated_models = {'author':models.Author} +    author = forms.IntegerField( +         widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \ +               'autocomplete-author', associated_model=models.Author, new=True), +         validators=[models.valid_id(models.Author)], label=_(u"Author")) + +class AuthorFormSet(FormSet): +    def clean(self): +        """Checks that no author are duplicated.""" +        return self.check_duplicate(('author',), +                                    _("There are identical authors.")) + +AuthorFormset = formset_factory(AuthorFormSelection, can_delete=True, +                                formset=AuthorFormSet) +AuthorFormset.form_label = _("Authors") + diff --git a/ishtar/furnitures/forms_context_records.py b/ishtar/ishtar_base/forms_context_records.py index a46d67995..a46d67995 100644 --- a/ishtar/furnitures/forms_context_records.py +++ b/ishtar/ishtar_base/forms_context_records.py diff --git a/ishtar/furnitures/forms_files.py b/ishtar/ishtar_base/forms_files.py index 9b45f0afc..9b45f0afc 100644 --- a/ishtar/furnitures/forms_files.py +++ b/ishtar/ishtar_base/forms_files.py diff --git a/ishtar/furnitures/forms_items.py b/ishtar/ishtar_base/forms_items.py index b6da0f889..b6da0f889 100644 --- a/ishtar/furnitures/forms_items.py +++ b/ishtar/ishtar_base/forms_items.py diff --git a/ishtar/furnitures/forms_main.py b/ishtar/ishtar_base/forms_main.py index 723b80d83..723b80d83 100644 --- a/ishtar/furnitures/forms_main.py +++ b/ishtar/ishtar_base/forms_main.py diff --git a/ishtar/furnitures/forms_operations.py b/ishtar/ishtar_base/forms_operations.py index c83b9f450..ffa310263 100644 --- a/ishtar/furnitures/forms_operations.py +++ b/ishtar/ishtar_base/forms_operations.py @@ -35,9 +35,9 @@ from ishtar import settings  import models  import widgets  from forms import Wizard, FinalForm, FormSet, SearchWizard, ClosingWizard, \ -     DeletionWizard, formset_factory, get_now, reverse_lazy, clean_duplicated +     DeletionWizard, formset_factory, get_now, reverse_lazy, get_form_selection  from forms_common import TownForm, TownFormSet, ParcelFormSet, ParcelForm,\ -                         get_town_field +                         AuthorFormset, SourceForm, SourceWizard, get_town_field  def is_preventive(form_name, model, type_key='operation_type', key=''):      def func(self, request, storage): @@ -48,9 +48,9 @@ def is_preventive(form_name, model, type_key='operation_type', key=''):                       request.session[storage.prefix]['step_data'][form_name]:              return False          try: -            type = int(request.session[storage.prefix]['step_data']\ -                                      [form_name][form_name+'-'+type_key]) -            return model.is_preventive(type, key) +            typ = int(request.session[storage.prefix]['step_data']\ +                                     [form_name][form_name+'-'+type_key]) +            return model.is_preventive(typ, key)          except ValueError:              return False      return func @@ -151,10 +151,6 @@ class OperationWizard(Wizard):                                                       data, files)          return form -    def get_extra_model(self, dct, request, storage, form_list): -        dct['history_modifier'] = request.user -        return dct -      def get_form_initial(self, request, storage, step):          initial = super(OperationWizard, self).get_form_initial(request,                                                             storage, step) @@ -366,7 +362,8 @@ class RemainForm(forms.Form):  class RemainFormSet(FormSet):      def clean(self):          """Checks that no remain types are duplicated.""" -        return clean_duplicated(self, ['remain_type']) +        return self.check_duplicate(['remain_type'], +                                    _(u"There are identical remain types"))  RemainFormset = formset_factory(RemainForm, can_delete=True,                                  formset=RemainFormSet) @@ -381,7 +378,8 @@ class PeriodForm(forms.Form):  class PeriodFormSet(FormSet):      def clean(self):          """Checks that no period are duplicated.""" -        return clean_duplicated(self, ['period']) +        return self.check_duplicate(['period'], +                                    _(u"There are identical periods"))  PeriodFormset = formset_factory(PeriodForm, can_delete=True,                                  formset=PeriodFormSet) @@ -496,6 +494,21 @@ operation_deletion_wizard = OperationDeletionWizard([                       ('final-operation_deletion', OperationDeletionForm)],                        url_name='operation_deletion',) +class OperationSourceWizard(SourceWizard): +    model = models.OperationSource + +OperationSourceFormSelection = get_form_selection( +    'OperationSourceFormSelection', _(u"Operation search"), 'operation', +    models.Operation, OperationSelect, 'get-operation', +    _(u"You should select an operation.")) + +operation_source_add_wizard = OperationSourceWizard([ +                 ('selec-operation_source_add', OperationSourceFormSelection), +                 ('source-operation_source_add', SourceForm), +                 ('authors-operation_source_add', AuthorFormset), +                 ('final-operation_source_add', FinalForm)], +                  url_name='operation_source_add',) +  class OperationAdministrativeActWizard(OperationWizard):      edit = False diff --git a/ishtar/furnitures/menus.py b/ishtar/ishtar_base/menus.py index 5b3a8a78b..3f8a7dd59 100644 --- a/ishtar/furnitures/menus.py +++ b/ishtar/ishtar_base/menus.py @@ -209,6 +209,15 @@ class Menu:                      access_controls=['add_treatment',                                       'add_own_treatment']),              ]), +        SectionItem('source_management', _(u"Documentation"), +            childs=[SectionItem('admin_add_sources', _(u"Add"), +                childs=[ +                MenuItem('operation_source_add', _(u"Related to an operation"), +                         model=models.OperationSource, +                         access_controls=['change_operation', +                                          'change_own_operation']), +                ]), +            ]),          SectionItem('warehouse', _(u"Warehouse"),              childs=[                      MenuItem('warehouse_inventory', _(u"Inventory"), diff --git a/ishtar/furnitures/models.py b/ishtar/ishtar_base/models.py index 37c958b30..7de7b239b 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/ishtar_base/models.py @@ -440,7 +440,7 @@ class Author(models.Model):          verbose_name_plural = _(u"Authors")      def __unicode__(self): -        return self.person + JOINT + self.source +        return unicode(self.person) + JOINT + unicode(self.author_type)  class SourceType(GeneralType):      class Meta: diff --git a/ishtar/furnitures/templatetags/__init__.py b/ishtar/ishtar_base/templatetags/__init__.py index 792d60054..792d60054 100644 --- a/ishtar/furnitures/templatetags/__init__.py +++ b/ishtar/ishtar_base/templatetags/__init__.py diff --git a/ishtar/furnitures/templatetags/range.py b/ishtar/ishtar_base/templatetags/range.py index 3b3a9097b..3b3a9097b 100644 --- a/ishtar/furnitures/templatetags/range.py +++ b/ishtar/ishtar_base/templatetags/range.py diff --git a/ishtar/furnitures/templatetags/table_form.py b/ishtar/ishtar_base/templatetags/table_form.py index 7adb54d65..7adb54d65 100644 --- a/ishtar/furnitures/templatetags/table_form.py +++ b/ishtar/ishtar_base/templatetags/table_form.py diff --git a/ishtar/furnitures/tests.py b/ishtar/ishtar_base/tests.py index 5a433b381..5a433b381 100644 --- a/ishtar/furnitures/tests.py +++ b/ishtar/ishtar_base/tests.py diff --git a/ishtar/furnitures/urls.py b/ishtar/ishtar_base/urls.py index 6d01923b5..cea34508f 100644 --- a/ishtar/furnitures/urls.py +++ b/ishtar/ishtar_base/urls.py @@ -67,6 +67,8 @@ ishtar_forms.file_administrativeactfile_wizard, name='file_administrativeactfile         url(BASE_URL + r'operation_administrativeactop_deletion/(?P<step>.+)$',       ishtar_forms.operation_administrativeactop_deletion_wizard,                                     name='operation_administrativeactop_deletion'), +         url(BASE_URL + r'operation_source_add/(?P<step>.+)$', +     ishtar_forms.operation_source_add_wizard, name='operation_source_add'),           url(BASE_URL + r'record_search/(?P<step>.+)$',             ishtar_forms.record_search_wizard, name='record_search'),           url(BASE_URL + r'record_creation/(?P<step>.+)$', @@ -93,13 +95,15 @@ for section in menu.childs:              actions.append(menu_item.idx)  actions = r"|".join(actions) -urlpatterns += patterns('ishtar.furnitures.views', +urlpatterns += patterns('ishtar.ishtar_base.views',       url(BASE_URL + r'(?P<action_slug>' + actions + r')/$', 'action',           name='action'),       url(BASE_URL + r'autocomplete-person/([0-9_]+)?$', 'autocomplete_person',                                        name='autocomplete-person'),       url(BASE_URL + r'autocomplete-town/$', 'autocomplete_town',                                        name='autocomplete-town'), +     url(BASE_URL + r'autocomplete-author/$', 'autocomplete_author', +                                      name='autocomplete-author'),       url(BASE_URL + r'autocomplete-organization/([0-9_]+)?$',                                        'autocomplete_organization',                                        name='autocomplete-organization'), @@ -141,6 +145,8 @@ urlpatterns += patterns('ishtar.furnitures.views',                      'new_warehouse', name='new-warehouse'),       url(BASE_URL + r'new-person/(?P<parent_name>.+)?/$',                  'new_person', name='new-person'), +     url(BASE_URL + r'new-author/(?P<parent_name>.+)?/$', +                'new_author', name='new-author'),       url(BASE_URL + r'new-organization/(?P<parent_name>.+)?/$',                  'new_organization', name='new-organization'),  ) diff --git a/ishtar/furnitures/views.py b/ishtar/ishtar_base/views.py index fce7c7bf3..9e998c2dc 100644 --- a/ishtar/furnitures/views.py +++ b/ishtar/ishtar_base/views.py @@ -78,8 +78,8 @@ def check_permission(request, action_slug, obj_id=None):      return menu.items[action_slug].can_be_available(request.user)  def autocomplete_person(request, person_type=None): -    if not request.user.has_perm('furnitures.view_person', models.Person) and \ -       not request.user.has_perm('furnitures.view_own_person', models.Person) : +    if not request.user.has_perm('ishtar_base.view_person', models.Person) and \ +       not request.user.has_perm('ishtar_base.view_own_person', models.Person) :          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'):          return HttpResponse(mimetype='text/plain') @@ -91,7 +91,7 @@ def autocomplete_person(request, person_type=None):          return HttpResponseBadRequest()      query = Q()      for q in q.split(' '): -        query = query & (Q(name__istartswith=q) | Q(surname__istartswith=q) | \ +        query = query & (Q(name__icontains=q) | Q(surname__icontains=q) | \                           Q(email__icontains=q))      if person_type:          try: @@ -124,8 +124,8 @@ def autocomplete_town(request):      return HttpResponse(data, mimetype='text/plain')  def autocomplete_file(request): -    if not request.user.has_perm('furnitures.view_file', models.File) and \ -       not request.user.has_perm('furnitures.view_own_file', models.File) : +    if not request.user.has_perm('ishtar_base.view_file', models.File) and \ +       not request.user.has_perm('ishtar_base.view_own_file', models.File) :          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'):          return HttpResponse(mimetype='text/plain') @@ -403,8 +403,8 @@ show_file = show_item(models.File, 'file')  revert_file = revert_item(models.File)  def autocomplete_operation(request, non_closed=True): -    if not request.user.has_perm('furnitures.view_operation', models.Operation)\ -       and not request.user.has_perm('furnitures.view_own_operation', +    if not request.user.has_perm('ishtar_base.view_operation', models.Operation)\ +       and not request.user.has_perm('ishtar_base.view_own_operation',                                                                models.Operation):          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'): @@ -443,9 +443,9 @@ get_administrativeactop = get_item(models.AdministrativeAct,                            'act_type__intented_to':'act_type__intented_to'})  def autocomplete_organization(request, orga_type=None): -    if not request.user.has_perm('furnitures.view_organization', +    if not request.user.has_perm('ishtar_base.view_organization',                                   models.Organization) and \ -       not request.user.has_perm('furnitures.view_own_organization', +       not request.user.has_perm('ishtar_base.view_own_organization',                                   models.Organization):          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'): @@ -489,8 +489,8 @@ get_archaeologicalitem = get_item(models.Item,  'base_items__is_isolated':'base_items__is_isolated'})  def autocomplete_warehouse(request): -    if not request.user.has_perm('furnitures.view_warehouse', models.Warehouse)\ -       and not request.user.has_perm('furnitures.view_own_warehouse', +    if not request.user.has_perm('ishtar_base.view_warehouse', models.Warehouse)\ +       and not request.user.has_perm('ishtar_base.view_own_warehouse',                                       models.Warehouse) :          return HttpResponse(mimetype='text/plain')      if not request.GET.get('term'): @@ -507,6 +507,27 @@ def autocomplete_warehouse(request):                                            for warehouse in warehouses])      return HttpResponse(data, mimetype='text/plain') +def autocomplete_author(request): +    if not request.user.has_perm('ishtar_base.view_author', models.Author)\ +       and not request.user.has_perm('ishtar_base.view_own_author', +                                     models.Warehouse) : +        return HttpResponse(mimetype='text/plain') +    if not request.GET.get('term'): +        return HttpResponse(mimetype='text/plain') +    q = request.GET.get('term') +    query = Q() +    for q in q.split(' '): +        extra = Q(person__name__icontains=q) | \ +                Q(person__surname__icontains=q) | \ +                Q(person__email__icontains=q) | \ +                Q(author_type__label__icontains=q) +        query = query & extra +    limit = 15 +    authors = models.Author.objects.filter(query)[:limit] +    data = json.dumps([{'id':author.pk, 'value':unicode(author)} +                                          for author in authors]) +    return HttpResponse(data, mimetype='text/plain') +  def new_item(model):      def func(request, parent_name):          model_name = model._meta.object_name @@ -537,6 +558,7 @@ def new_item(model):  new_warehouse = new_item(models.Warehouse)  new_person = new_item(models.Person)  new_organization = new_item(models.Organization) +new_author = new_item(models.Author)  def action(request, action_slug, obj_id=None, *args, **kwargs):      """ diff --git a/ishtar/furnitures/widgets.py b/ishtar/ishtar_base/widgets.py index e058f7074..e058f7074 100644 --- a/ishtar/furnitures/widgets.py +++ b/ishtar/ishtar_base/widgets.py diff --git a/ishtar/scripts/import_from_csv.py b/ishtar/scripts/import_from_csv.py index 7eb655641..de916be6f 100755 --- a/ishtar/scripts/import_from_csv.py +++ b/ishtar/scripts/import_from_csv.py @@ -19,7 +19,7 @@ setup_environ(settings)  from optparse import OptionParser -from furnitures import models +from ishtar_base import models  def insert_department(value):      idx, label = value diff --git a/ishtar/scripts/import_towns_from_osm.py b/ishtar/scripts/import_towns_from_osm.py index 6c5698b4b..fb301f09f 100755 --- a/ishtar/scripts/import_towns_from_osm.py +++ b/ishtar/scripts/import_towns_from_osm.py @@ -24,7 +24,7 @@ setup_environ(settings)  from optparse import OptionParser  from xml.parsers import expat -from furnitures import models +from ishtar_base import models  usage = "usage: %prog osm_file.xml"  parser = OptionParser(usage=usage) diff --git a/ishtar/settings.py.example b/ishtar/settings.py.example index 11b2e3a58..e373faa6f 100644 --- a/ishtar/settings.py.example +++ b/ishtar/settings.py.example @@ -97,7 +97,7 @@ MIDDLEWARE_CLASSES = (  )  TEMPLATE_CONTEXT_PROCESSORS = ( -    'ishtar.furnitures.context_processors.get_base_context', +    'ishtar.ishtar_base.context_processors.get_base_context',      "django.core.context_processors.auth",      "django.core.context_processors.debug",      "django.core.context_processors.i18n", @@ -112,7 +112,7 @@ TEMPLATE_DIRS = (  AUTHENTICATION_BACKENDS = (      'django.contrib.auth.backends.ModelBackend', -    'ishtar.furnitures.backend.ObjectOwnPermBackend', +    'ishtar.ishtar_base.backend.ObjectOwnPermBackend',  )  INSTALLED_APPS = ( @@ -124,5 +124,5 @@ INSTALLED_APPS = (      'django.contrib.admin',      'registration',      #'ishtar.scripts', -    'ishtar.furnitures' +    'ishtar.ishtar_base',  ) diff --git a/ishtar/urls.py b/ishtar/urls.py index 43f11943a..baa906979 100644 --- a/ishtar/urls.py +++ b/ishtar/urls.py @@ -12,8 +12,8 @@ BASE_URL = r'^' + URL_PATH  urlpatterns = patterns('',       (BASE_URL + 'accounts/', include('registration.urls')),       (BASE_URL + r'admin/', include(admin.site.urls)), -     ('', include('ishtar.furnitures.urls')), +     ('', include('ishtar.ishtar_base.urls')),  ) -urlpatterns += patterns('ishtar.furnitures.views', +urlpatterns += patterns('ishtar.ishtar_base.views',       url(BASE_URL + '$', 'index', name='start'),       ) | 
