summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit05c6d94c9547377c9979e9d860c6618ee898ef6e (patch)
tree6b4fc14f42da9d91ab2bb4b989ffeeb42947392f
parent2d008477cb66ec3e356fd9153afba7affede249c (diff)
downloadIshtar-05c6d94c9547377c9979e9d860c6618ee898ef6e.tar.bz2
Ishtar-05c6d94c9547377c9979e9d860c6618ee898ef6e.zip
Sources creation for Operation (refs #497) - restructuration (refs #57)
-rw-r--r--ishtar/__init__.py1
-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-xishtar/scripts/import_from_csv.py2
-rwxr-xr-xishtar/scripts/import_towns_from_osm.py2
-rw-r--r--ishtar/settings.py.example6
-rw-r--r--ishtar/urls.py4
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'),
)