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'), ) |