diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-12-17 13:40:51 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-12-17 13:43:19 +0100 | 
| commit | ccd858622c1ef161b355f020055682c6e424ad98 (patch) | |
| tree | d4018e5e84b81969446bfcbac6fc84f8ddea1f64 | |
| parent | ba9020ad8e995b73058ebd01ac978acc70de0cb7 (diff) | |
| download | Ishtar-ccd858622c1ef161b355f020055682c6e424ad98.tar.bz2 Ishtar-ccd858622c1ef161b355f020055682c6e424ad98.zip | |
Organizations management (refs #1568)
* select, create, modify forms
* create, modify, wizard
* sheet templates
* associated actions, urls
| -rw-r--r-- | ishtar_common/forms_common.py | 20 | ||||
| -rw-r--r-- | ishtar_common/ishtar_menu.py | 16 | ||||
| -rw-r--r-- | ishtar_common/menus.py | 2 | ||||
| -rw-r--r-- | ishtar_common/models.py | 8 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/sheet_organization.html | 41 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/sheet_organization_pdf.html | 18 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/sheet_organization_window.html | 3 | ||||
| -rw-r--r-- | ishtar_common/urls.py | 9 | ||||
| -rw-r--r-- | ishtar_common/views.py | 54 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 6 | 
10 files changed, 156 insertions, 21 deletions
| diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index b6cab8b6a..ec3ccfb8b 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -67,6 +67,8 @@ def get_person_field(label=_(u"Person"), required=True, person_types=[]):                                validators=[models.valid_id(models.Person)])  class OrganizationForm(forms.Form): +    form_label = _(u"Organization") +    associated_models = {'organization_type':models.OrganizationType}      name = forms.CharField(label=_(u"Name"), max_length=40,                                validators=[name_validator])      organization_type = forms.ChoiceField(label=_(u"Organization type"), @@ -100,6 +102,24 @@ class OrganizationForm(forms.Form):          new_item.save()          return new_item +class OrganizationSelect(TableSelect): +    name = forms.CharField(label=_(u"Name"), max_length=30) +    organization_type = forms.ChoiceField(label=_(u"Type"), choices=[]) + +    def __init__(self, *args, **kwargs): +        super(OrganizationSelect, self).__init__(*args, **kwargs) +        self.fields['organization_type'].choices = \ +                                models.OrganizationType.get_types() + +class OrganizationFormSelection(forms.Form): +    form_label = _(u"Organization search") +    associated_models = {'pk':models.Organization} +    currents = {'pk':models.Organization} +    pk = forms.IntegerField(label="", +         widget=widgets.JQueryJqGrid(reverse_lazy('get-organization'), +                                     OrganizationSelect, models.Organization), +         validators=[models.valid_id(models.Organization)]) +  class PersonSelect(TableSelect):      name = forms.CharField(label=_(u"Name"), max_length=30)      surname = forms.CharField(label=_(u"Surname"), max_length=20) diff --git a/ishtar_common/ishtar_menu.py b/ishtar_common/ishtar_menu.py index 1c198ad91..76961aea9 100644 --- a/ishtar_common/ishtar_menu.py +++ b/ishtar_common/ishtar_menu.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2010-2012 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2013 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as @@ -26,7 +26,8 @@ import models  MENU_SECTIONS = [      (10, SectionItem('administration', _(u"Administration"), -            childs=[SectionItem('person', _(u"Person"), +            childs=[ +                SectionItem('person', _(u"Person"),                  childs=[                      MenuItem('person_creation', _(u"Creation"),                          model=models.Person, @@ -35,6 +36,17 @@ MENU_SECTIONS = [                          model=models.Person,                          access_controls=['change_person', 'change_own_person']),                      ]), +                SectionItem('organization', _(u"Organization"), +                childs=[ +                    MenuItem('organization_creation', _(u"Creation"), +                        model=models.Organization, +                        access_controls=['add_organization', +                                         'add_own_organization']), +                    MenuItem('organization_modification', _(u"Modification"), +                        model=models.Organization, +                        access_controls=['change_organization', +                                         'change_own_organization']), +                    ]),                  MenuItem('account_management', _(u"Account management"),                      model=models.IshtarUser,                      access_controls=['add_ishtaruser',]), diff --git a/ishtar_common/menus.py b/ishtar_common/menus.py index 77dcabcd3..465692ec6 100644 --- a/ishtar_common/menus.py +++ b/ishtar_common/menus.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2010-2012 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2013 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 77a7d6562..473d634fa 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -701,6 +701,7 @@ class OrganizationType(GeneralType):          ordering = ('label',)  class Organization(Address, OwnPerms, ValueGetter): +    TABLE_COLS = ('name', 'organization_type',)      name = models.CharField(_(u"Name"), max_length=100)      organization_type = models.ForeignKey(OrganizationType,                                            verbose_name=_(u"Type")) @@ -719,6 +720,13 @@ class Organization(Address, OwnPerms, ValueGetter):      def __unicode__(self):          return self.name +    @property +    def associated_filename(self): +        values = [unicode(getattr(self, attr)) +                   for attr in ('organization_type', 'name') +                               if getattr(self, attr)] +        return slugify(u"-".join(values)) +  class PersonType(GeneralType):      #rights = models.ManyToManyField(WizardStep, verbose_name=_(u"Rights"))      groups = models.ManyToManyField(Group, verbose_name=_(u"Groups"), diff --git a/ishtar_common/templates/ishtar/sheet_organization.html b/ishtar_common/templates/ishtar/sheet_organization.html new file mode 100644 index 000000000..64f8fe5c7 --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_organization.html @@ -0,0 +1,41 @@ +{% extends "ishtar/sheet.html" %} +{% load i18n %} + +{% block head_sheet %} +{{block.super}} +<h1>{% trans "Organization"%}</h1> +{% endblock %} + +{% block content %} +<div class='tool'>{%trans "Export as:"%} <a href='{% url show-organization item.pk "odt" %}'>{%trans "OpenOffice.org file"%}</a>, <a href='{% url show-organization item.pk "pdf" %}'>{%trans "PDF file"%}</a></div> + +<p><label>{% trans "Name" %}</label> <span class='value'>{{item.name}}</span></p> +{% if item.address %}<p><label>{% trans "Address" %}</label> <span class='value'>{{item.address}}</span></p> {% endif %} +{% if item.address_complement %}<p><label>{% trans "Address complement" %}</label> <span class='value'>{{item.address_complement}}</span></p> {% endif %} +{% if item.postal_code %}<p><label>{% trans "Postal code" %}</label> <span class='value'>{{item.postal_code}}</span></p> {% endif %} +{% if item.town %}<p><label>{% trans "Town" %}</label> <span class='value'>{{item.town}}</span></p> {% endif %} +{% if item.phone %}<p><label>{% trans "Phone" %}</label> <span class='value'>{{item.phone}}</span></p> {% endif %} +{% if item.mobile_phone %}<p><label>{% trans "Mobile phone" %}</label> <span class='value'>{{item.mobile_phone}}</span></p> {% endif %} + + +<table> +  <caption>{%trans "Person in the organization"%}</caption> +  <tr> +    <th>{% trans "Name" %}</th> +    <th>{% trans "Surname" %}</th> +    <th>{% trans "Type" %}</th> +    <th class='link'> </th> +  </tr> +  {% for person in item.members.all %} +  <tr> +    <td class='string'>{{person.name|default:""}}</td> +    <td class='string'>{{person.surname|default:""}}</td> +    <td>{% for type in person.person_types.all %}{% if forloop.counter0 %}, {% endif %}{{type.label}}{% endfor %}</td> +    <td class='link'><a href="#" onclick='load_window("{%url show-person person.pk ''%}")'>{% trans "Details" %}</a></td> +  </tr> +  {% empty %} +  <tr><td colspan="8" class='no_items'>{% trans "No person in this organization" %}</td></tr> +  {% endfor %} +</table> + +{% endblock %} diff --git a/ishtar_common/templates/ishtar/sheet_organization_pdf.html b/ishtar_common/templates/ishtar/sheet_organization_pdf.html new file mode 100644 index 000000000..79e89ef0b --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_organization_pdf.html @@ -0,0 +1,18 @@ +{% extends "ishtar/sheet_organization.html" %} +{% block header %} +<link rel="stylesheet" href="{{STATIC_URL}}/media/style_basic.css" /> +{% endblock %} +{% block main_head %} +{{ block.super }} +<div id="pdfheader"> +Ishtar – {{APP_NAME}} – {{item}} +</div> +{% endblock %} +{%block head_sheet%}{%endblock%} +{%block main_foot%} +<div id="pdffooter"> +– <pdf:pagenumber/> – +</div> +</body> +</html> +{%endblock%} diff --git a/ishtar_common/templates/ishtar/sheet_organization_window.html b/ishtar_common/templates/ishtar/sheet_organization_window.html new file mode 100644 index 000000000..a0e5d9b77 --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_organization_window.html @@ -0,0 +1,3 @@ +{% extends "ishtar/sheet_organization.html" %} +{% block main_head %}{%endblock%} +{% block main_foot %}{%endblock%} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 35354409e..565db57d5 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -35,6 +35,11 @@ urlpatterns = patterns('',             views.person_creation_wizard, name='person_creation'),         url(r'person_modification/(?P<step>.+)?$',             views.person_modification_wizard, name='person_modification'), +       url(r'organization_creation/(?P<step>.+)?$', +           views.organization_creation_wizard, name='organization_creation'), +       url(r'organization_modification/(?P<step>.+)?$', +           views.organization_modification_wizard, +           name='organization_modification'),         url(r'account_management/(?P<step>.+)?$',             views.account_management_wizard, name='account_management'),         ) @@ -70,6 +75,10 @@ urlpatterns += patterns('ishtar_common.views',             name='autocomplete-author'),       url(r'new-organization/(?P<parent_name>.+)?/$',             'new_organization', name='new-organization'), +     url(r'get-organization/(?P<type>.+)?$', 'get_organization', +           name='get-organization'), +     url(r'show-organization/(?P<pk>.+)?/(?P<type>.+)?$', +           'show_organization', name='show-organization'),       url(r'autocomplete-organization/([0-9_]+)?$',             'autocomplete_organization', name='autocomplete-organization'),       url(r'(?P<action_slug>' + actions + r')/$', 'action', diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 5e49ddc13..c03870935 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -51,10 +51,8 @@ if settings.XHTML2ODT_PATH:  from menus import menu  from ishtar_common.forms import FinalForm -from ishtar_common.forms_common import PersonForm, PersonTypeForm, \ -    PersonFormSelection, AccountForm, FinalAccountForm, OrganizationForm, \ -    AuthorForm, SimplePersonForm -from ishtar_common.wizards import PersonWizard, PersonModifWizard, AccountWizard +from ishtar_common import forms_common as forms +from ishtar_common import wizards  import models  CSV_OPTIONS = {'delimiter':';', 'quotechar':'"', 'quoting':csv.QUOTE_ALL} @@ -74,25 +72,38 @@ def index(request):          return render_to_response('index.html', dct,                                context_instance=RequestContext(request)) -person_creation_wizard = PersonWizard.as_view([ -                        ('identity-person_creation', SimplePersonForm), -                        ('person_type-person_creation', PersonTypeForm), +person_creation_wizard = wizards.PersonWizard.as_view([ +                        ('identity-person_creation', forms.SimplePersonForm), +                        ('person_type-person_creation', forms.PersonTypeForm),                          ('final-person_creation', FinalForm)],                           label=_(u"New person"),                           url_name='person_creation') -person_modification_wizard = PersonModifWizard.as_view([ -                      ('selec-person_modification', PersonFormSelection), -                      ('identity-person_modification', SimplePersonForm), -                      ('person_type-person_creation', PersonTypeForm), +person_modification_wizard = wizards.PersonModifWizard.as_view([ +                      ('selec-person_modification', forms.PersonFormSelection), +                      ('identity-person_modification', forms.SimplePersonForm), +                      ('person_type-person_creation', forms.PersonTypeForm),                        ('final-person_modification', FinalForm)],                         label=_(u"Person modification"),                         url_name='person_modification') -account_management_wizard = AccountWizard.as_view([ -                    ('selec-account_management', PersonFormSelection), -                    ('account-account_management', AccountForm), -                    ('final-account_management', FinalAccountForm)], +organization_creation_wizard = wizards.OrganizationWizard.as_view([ +                    ('identity-organization_creation', forms.OrganizationForm), +                    ('final-organization_creation', FinalForm)], +                     label=_(u"New organization"), +                     url_name='organization_creation') + +organization_modification_wizard = wizards.OrganizationModifWizard.as_view([ +          ('selec-organization_modification', forms.OrganizationFormSelection), +          ('identity-organization_modification', forms.OrganizationForm), +          ('final-organization_modification', FinalForm)], +                       label=_(u"Organization modification"), +                       url_name='organization_modification') + +account_management_wizard = wizards.AccountWizard.as_view([ +                    ('selec-account_management', forms.PersonFormSelection), +                    ('account-account_management', forms.AccountForm), +                    ('final-account_management', forms.FinalAccountForm)],                       label=_(u"Account management"),                       url_name='account_management',) @@ -584,9 +595,16 @@ def new_item(model, frm):                                    context_instance=RequestContext(request))      return func -new_person = new_item(models.Person, PersonForm) -new_organization = new_item(models.Organization, OrganizationForm) -new_author = new_item(models.Author, AuthorForm) +new_person = new_item(models.Person, forms.PersonForm) +new_organization = new_item(models.Organization, forms.OrganizationForm) +show_organization = show_item(models.Organization, 'organization') +get_organization = get_item(models.Organization, +        'get_organization', 'organization', +      extra_request_keys={ +                  'name':'name__icontains', +                  'organization_type':'organization_type__pk__in', +                  },) +new_author = new_item(models.Author, forms.AuthorForm)  show_person = show_item(models.Person, 'person')  get_person = get_item(models.Person,          'get_person', 'person', diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index ec684650f..55c9d0d9d 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -839,6 +839,12 @@ class PersonWizard(Wizard):  class PersonModifWizard(PersonWizard):      modification = True +class OrganizationWizard(Wizard): +    model = models.Organization + +class OrganizationModifWizard(OrganizationWizard): +    modification = True +  class AccountWizard(Wizard):      model = models.Person      def get_formated_datas(self, forms): | 
