diff options
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/forms_common.py | 31 | ||||
-rw-r--r-- | ishtar_common/static/media/style.css | 1 | ||||
-rw-r--r-- | ishtar_common/urls.py | 6 | ||||
-rw-r--r-- | ishtar_common/views.py | 7 | ||||
-rw-r--r-- | ishtar_common/widgets.py | 12 |
5 files changed, 45 insertions, 12 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 874e2dabf..8964ae57b 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -66,7 +66,29 @@ def get_person_field(label=_(u"Person"), required=True, person_types=[]): return forms.IntegerField(widget=widget, label=label, required=required, validators=[models.valid_id(models.Person)]) -class OrganizationForm(forms.Form): +class NewItemForm(forms.Form): + def __init__(self, *args, **kwargs): + self.limits = {} + if 'limits' in kwargs: + limits = kwargs.pop('limits') + if limits: + for item in limits.split(';'): + key, values = item.split('__') + self.limits[key] = values.split('-') + super(NewItemForm, self).__init__(*args, **kwargs) + + def limit_fields(self): + for key in self.limits: + if key in self.fields and hasattr(self.fields[key], 'choices'): + new_choices = [] + for value, lbl in self.fields[key].choices: + if unicode(value) in self.limits[key]: + new_choices.append((value, lbl)) + self.fields[key].choices = new_choices + if len(new_choices) == 1: + self.fields[key].initial = [new_choices[0][0]] + +class OrganizationForm(NewItemForm): form_label = _(u"Organization") associated_models = {'organization_type':models.OrganizationType} name = forms.CharField(label=_(u"Name"), max_length=300, @@ -93,6 +115,7 @@ class OrganizationForm(forms.Form): models.OrganizationType.get_types() self.fields['organization_type'].help_text = \ models.OrganizationType.get_help() + self.limit_fields() def save(self, user): dct = self.cleaned_data @@ -145,7 +168,7 @@ class PersonFormSelection(forms.Form): PersonSelect, models.Person), validators=[models.valid_id(models.Person)]) -class SimplePersonForm(forms.Form): +class SimplePersonForm(NewItemForm): form_label = _("Identity") associated_models = {'attached_to':models.Organization} title = forms.ChoiceField(label=_("Title"), choices=models.Person.TYPE) @@ -181,6 +204,7 @@ class PersonForm(SimplePersonForm): self.fields['person_types'].choices = models.PersonType.get_types( empty_first=False) self.fields['person_types'].help_text = models.PersonType.get_help() + self.limit_fields() def save(self, user): dct = self.cleaned_data @@ -320,7 +344,7 @@ class SourceDeletionForm(FinalForm): # Authors management # ###################### -class AuthorForm(forms.Form): +class AuthorForm(NewItemForm): form_label = _(u"Author") associated_models = {'person':models.Person, 'author_type':models.AuthorType} @@ -333,6 +357,7 @@ class AuthorForm(forms.Form): def __init__(self, *args, **kwargs): super(AuthorForm, self).__init__(*args, **kwargs) self.fields['author_type'].choices = models.AuthorType.get_types() + self.limit_fields() def save(self, user): dct = self.cleaned_data diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css index 8b05603df..d2dda0758 100644 --- a/ishtar_common/static/media/style.css +++ b/ishtar_common/static/media/style.css @@ -414,6 +414,7 @@ div.form { margin-left:auto; margin-right:auto; width:600px; + background-color:#F1F2F6; } .form table th{ diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 94e50d161..c46f555e9 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -65,7 +65,7 @@ urlpatterns += patterns('ishtar_common.views', name='dashboard-main'), url(r'update-current-item/$', 'update_current_item', name='update-current-item'), - url(r'new-person/(?P<parent_name>.+)?/$', + url(r'new-person/(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', 'new_person', name='new-person'), url(r'autocomplete-person(?:/([0-9_]+))?/(user)?$', 'autocomplete_person', name='autocomplete-person'), @@ -77,11 +77,11 @@ urlpatterns += patterns('ishtar_common.views', name='autocomplete-town'), url(r'autocomplete-department/?$', 'autocomplete_department', name='autocomplete-department'), - url(r'new-author/(?P<parent_name>.+)?/$', + url(r'new-author/(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', 'new_author', name='new-author'), url(r'autocomplete-author/$', 'autocomplete_author', name='autocomplete-author'), - url(r'new-organization/(?P<parent_name>.+)?/$', + url(r'new-organization/(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', 'new_organization', name='new-organization'), url(r'get-organization/(?P<type>.+)?$', 'get_organization', name='get-organization'), diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 8fbf41759..11351d7c0 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -636,15 +636,14 @@ def autocomplete_author(request): return HttpResponse(data, mimetype='text/plain') def new_item(model, frm): - def func(request, parent_name): + def func(request, parent_name, limits=''): model_name = model._meta.object_name if not check_permission(request, 'add_'+model_name.lower()): not_permitted_msg = ugettext(u"Operation not permitted.") return HttpResponse(not_permitted_msg) - #frm = getattr(ishtar_forms, model_name + 'Form') dct = {'title':unicode(_(u'New %s' % model_name.lower()))} if request.method == 'POST': - dct['form'] = frm(request.POST) + dct['form'] = frm(request.POST, limits=limits) if dct['form'].is_valid(): new_item = dct['form'].save(request.user) dct['new_item_label'] = unicode(new_item) @@ -657,7 +656,7 @@ def new_item(model, frm): return render_to_response('window.html', dct, context_instance=RequestContext(request)) else: - dct['form'] = frm() + dct['form'] = frm(limits=limits) return render_to_response('window.html', dct, context_instance=RequestContext(request)) return func diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 2105b73e3..71d88d062 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -134,7 +134,7 @@ class JQueryDate(forms.TextInput): class JQueryAutoComplete(forms.TextInput):
def __init__(self, source, associated_model=None, options={}, attrs={},
- new=False, multiple=False):
+ new=False, multiple=False, limit={}):
"""
Source can be a list containing the autocomplete values or a
string containing the url used for the request.
@@ -148,6 +148,7 @@ class JQueryAutoComplete(forms.TextInput): self.attrs.update(attrs)
self.new = new
self.multiple = multiple
+ self.limit = limit
def value_from_datadict(self, data, files, name):
if self.multiple:
@@ -222,7 +223,14 @@ class JQueryAutoComplete(forms.TextInput): new = ''
if self.new:
model_name = self.associated_model._meta.object_name.lower()
- url_new = reverse('new-' + model_name, args=[attrs_select['id']])
+ limits = []
+ for k in self.limit:
+ limits.append(k + "__" + "-".join(
+ [unicode(v) for v in self.limit[k]]))
+ args = [attrs_select['id']]
+ if limits:
+ args.append(';'.join(limits))
+ url_new = reverse('new-' + model_name, args=args)
new = u' <a href="#" class="add-button" '\
u'onclick="open_window(\'%s\');">+</a>' % url_new
html = u'''<input%(attrs_select)s/>%(new)s\
|