======== TICKET ======== DEFINIZIONI: ============ **organizations** sono tutte le 'Organization' attive e non **owner_organizations** sono le 'Organization' attive titolari del software (category = "com") **customer_organizations** sono le 'Organization' attive di tipo cliente (category = "cus") **supplier_organizations** sono le 'Organization' attive di tipo fornitori (category = "sup") **contacts** sono tutti i 'Contact' attivi e non **owner_contacts** sono i 'Contact' attivi dipendenti delle 'Owner Organizations' **customer_contacts** sono i 'Contact' attivi dipendenti delle 'Customer Organizations' **supplier_contacts** sono i 'Contact' attivi dipendenti delle 'Supplier Organizations' **worker_contacts** sono i 'Contact' attivi dipendenti delle 'Owner e Supplier Organizations' **potential_managers** sono i 'Contact' attivi che possono gestire i progetti e i ticket (owner_contacts) **potential_staff** sono i 'Contact' attivi che possono lavorare i ticket (worker_contacts) **ticket_projects** sono i 'TicketProject' attivi e non **active_ticket_projects** sono i 'TicketProject' attivi e validi Permessi ======== I permessi per l'accesso e la visibilità dei progetti e dei ticket sono regolati da un sistema a vari livelli. Non è possibile aggiungere ticket se non si hanno i normali permessi di django (``add_ticket``, ``change_ticket``, ...). Quindi è opportuno creare un gruppo apposito (es.: ``ticket user``). In aggiunta a questo prerequisito è possibile operare in uno dei 2 seguenti modi: 1. con permessi espliciti su ogni singolo progetto, come definiti oltre in questo documento 2. con permessi del contatto definiti in modo generale per tutti i progetti. In questa modalità non verranno però inviate le mail anche nel caso vengano attivate. Questi permessi possono essere impostati dalla dashboard dei ticket, altre tabelle, Permessi ticket. ESEMPIO: ======== users: ------ :: from django.contrib.auth.models import User users = User.objects.all() [ , , , , , , , , , , , , , , , ] +---------------+-------------+----+----+-----+ | username | password | SU | ST | ACT | +===============+=============+====+====+=====+ | vittorino | vitto | F | T | T | +---------------+-------------+----+----+-----+ | sandro | sandro | F | T | T | +---------------+-------------+----+----+-----+ | luca | luca | F | T | T | +---------------+-------------+----+----+-----+ | daniele | daniele | F | T | T | +---------------+-------------+----+----+-----+ | marco | marco | F | F | F | +---------------+-------------+----+----+-----+ | francesca | francesca | F | T | T | +---------------+-------------+----+----+-----+ | giorgia | giorgia | F | T | T | +---------------+-------------+----+----+-----+ | martina | martina | F | T | T | +---------------+-------------+----+----+-----+ | daniela | daniela | F | T | T | +---------------+-------------+----+----+-----+ | giovanna | giovanna | F | F | F | +---------------+-------------+----+----+-----+ | luisa | luisa | F | T | T | +---------------+-------------+----+----+-----+ | chiara | chiara | F | T | T | +---------------+-------------+----+----+-----+ | elena | elena | F | T | T | +---------------+-------------+----+----+-----+ | paolo | paolo | F | T | T | +---------------+-------------+----+----+-----+ | fabio | fabio | F | T | T | +---------------+-------------+----+----+-----+ | admin | admin | F | T | T | +---------------+-------------+----+----+-----+ organizations: -------------- :: from jmb.organization.models import Organization organizations = Organization.objects.all() [ , , , , , ] *owner* :: owner_organizations = Organization.owners.all() [] thunder = owner_organizations.get(name="Thunder Systems") *customer* :: customer_organizations = Organization.customers.all() [, , ] barilla = customer_organizations.get(name="Barilla") de_cecco = customer_organizations.get(name="De Cecco") voiello = customer_organizations.get(name="Voiello") *supplier* :: supplier_organizations = Organization.suppliers.all() [, ] siex = supplier_organizations.get(name="Siex") cogema = supplier_organizations.get(name="Cogema") +-----------------+-----+ | Name | ACT | +=================+=====+ | Barilla | T | +-----------------+-----+ | Cogema | T | +-----------------+-----+ | De Cecco | T | +-----------------+-----+ | Siex | T | +-----------------+-----+ | Thunder Systems | T | +-----------------+-----+ | Voiello | T | +-----------------+-----+ contacts: --------- :: from jmb.organization.models import Contact contacts = Contact.objects.all() [ , , , , , , , , , , , , , , ] *owner* :: owner_contacts = Contact.owners.all() [ , , , , ] *customer* :: customer_contacts = Contact.customers.all() [ , , , , , , , ] *supplier* :: supplier_contacts = Contact.suppliers.all() [, ] *worker* :: worker_contacts = Contact.workers.all() [ , , , , , , ] owner contacts: ----------------- :: thunder_contacts = thunder.contacts.filter(status=1) [ , , , , ] customer contacts: ------------------ :: barilla_contacts = barilla.contacts.filter(status=1) [ , , ] de_cecco_contacts = de_cecco.contacts.filter(status=1) [ , , ] voiello_contact = voiello.contacts.filter(status=1) [, ] supplier contacts: ------------------ :: siex_contacts = siex.contacts.filter(status=1) [] cogema_contacts = cogema.contacts.filter(status=1) [] potential contacts: ------------------- :: potential_managers = owner_contacts [ , , , , ] potential_staff = worker_contacts [ , , , , , , ] potential_customers = customer_contacts [ , , , , , , , ] ticket projects: ---------------- :: from jmb.ticket.models import TicketProject ticket_projects = TicketProject.objects.all() [ , , , , ] active_ticket_projects = TicketProject.active.all() [ , , , , ] +-------------+------------+--------------+ | name | date start | date end | +=============+============+==============+ | barilla sw1 | 2013, 1, 1 | 2013, 12, 31 | +-------------+------------+--------------+ | barilla sw2 | 2013, 1, 1 | 2013, 12, 31 | +-------------+------------+--------------+ | barilla sw3 | 2013, 1, 1 | 2013, 12, 31 | +-------------+------------+--------------+ | de cecco sw | 2013, 1, 1 | 2013, 12, 31 | +-------------+------------+--------------+ | voiello sw | 2013, 1, 1 | 2013, 12, 31 | +-------------+------------+--------------+ *barilla* :: barilla_ticket_projects = active_ticket_projects.filter(organization=barilla) [ , , ] *de cecco* :: de_cecco_ticket_projects = active_ticket_projects.filter(organization=de_cecco) [] *voiello* :: voiello_ticket_projects = active_ticket_projects.filter(organization=voiello) [] ticket contacts: ---------------- **barilla** *managers* :: barilla_ticket_managers = potential_managers.filter( managed_ticketprojects__organization=barilla ).distinct() [, ] *staff* :: barilla_ticket_staff = potential_staff.filter( assigned_ticketprojects__organization=barilla ).distinct() [ , , ] *customers* :: barilla_ticket_customers = potential_customers.filter( visible_ticketprojects__organization=barilla ).distinct() [ , ] *submitters* :: barilla_ticket_submitters = contacts.filter( Q(managed_ticketprojects__organization=barilla)| Q(assigned_ticketprojects__organization=barilla)| Q(visible_ticketprojects__organization=barilla), status=1 ).distinct() [ , , , , ] +--------------+-----------+-----------+-----------+-----------+ | organization | manager | staff | customer | submitter | +==============+===========+===========+===========+===========+ | barilla | sandro | luca | francesca | francesca | | +-----------+-----------+-----------+-----------+ | | vittorino | sandro | giorgia | giorgia | | +-----------+-----------+-----------+-----------+ | | | vittorino | | luca | | +-----------+-----------+-----------+-----------+ | | | | | sandro | | +-----------+-----------+-----------+-----------+ | | | | | vittorino | +--------------+-----------+-----------+-----------+-----------+ **ticket project** *barilla sw1* :: barilla_sw1 = barilla_ticket_projects.get(name='barilla sw1') *managers* :: barilla_sw1_managers = barilla_sw1.managers.filter(status=1) [, ] *staff* :: barilla_sw1_staff = barilla_sw1.staff.filter(status=1) [ , , ] *customers* :: barilla_sw1_customers = barilla_sw1.customers.filter(status=1) [] *submitters* :: barilla_sw1_submitters = contacts.filter( Q(managed_ticketprojects=barilla_sw1)| Q(assigned_ticketprojects=barilla_sw1)| Q(visible_ticketprojects=barilla_sw1), status=1 ).distinct() [ , , , ] *barilla sw2* :: barilla_sw2 = barilla_ticket_projects.get(name='barilla sw2') *managers* :: barilla_sw2_managers = barilla_sw2.managers.filter(status=1) [, ] *staff* :: barilla_sw2_staff = barilla_sw2.staff.filter(status=1) [] *submitters* :: barilla_sw2_customers = barilla_sw2.customers.filter(status=1) [, ] barilla_sw2_submitters = contacts.filter( Q(managed_ticketprojects=barilla_sw2)| Q(assigned_ticketprojects=barilla_sw2)| Q(visible_ticketprojects=barilla_sw2), status=1 ).distinct() [ , , , ] +----------------+-----------+-----------+-----------+-----------+ | ticket Project | manager | staff | customer | submitter | +================+===========+===========+===========+===========+ | barilla_sw1 | sandro | luca | francesca | francesca | | +-----------+-----------+-----------+-----------+ | | vittorino | sandro | | luca | | +-----------+-----------+-----------+-----------+ | | | vittorino | | sandro | | +-----------+-----------+-----------+-----------+ | | | | | vittorino | +----------------+-----------+-----------+-----------+-----------+ | barilla_sw2 | sandro | vittorino | francesca | francesca | | +-----------+-----------+-----------+-----------+ | | vittorino | | giorgia | giorgia | | +-----------+-----------+-----------+-----------+ | | | | | sandro | | +-----------+-----------+-----------+-----------+ | | | | | vittorino | +----------------+-----------+-----------+-----------+-----------+ **contacts** :: vittorino = potential_managers.get(last_name='Vittorino') daniele = potential_staff.get(last_name='Daniele') giorgia = potential_customers.get(last_name='Giorgia') *is manager* :: is_manager = vittorino.managed_ticketprojects.all().count() > 0 True is_manager = daniele.managed_ticketprojects.all().count() > 0 False is_manager = giorgia.managed_ticketprojects.all().count() > 0 False *is staff* :: is_staff = vittorino.assigned_ticketprojects.all().count() > 0 True is_staff = daniele.assigned_ticketprojects.all().count() > 0 False is_staff = giorgia.assigned_ticketprojects.all().count() > 0 False *is customer* :: is_customer = vittorino.visible_ticketprojects.all().count() > 0 False is_customer = daniele.visible_ticketprojects.all().count() > 0 False is_customer = giorgia.visible_ticketprojects.all().count() > 0 True *is submitter* :: is_submitter = active_ticket_projects.filter( Q(managers=vittorino)| Q(staff=vittorino)| Q(customers=vittorino) ).count() > 0 True is_submitter = active_ticket_projects.filter( Q(managers=daniele)| Q(staff=daniele)| Q(customers=daniele) ).count() > 0 False is_submitter = active_ticket_projects.filter( Q(managers=giorgia)| Q(staff=giorgia)| Q(customers=giorgia) ).count() > 0 True +-----------+---+---+---+---+ | contact | M | A | V | S | +===========+===+===+===+===+ | vittorino | T | T | F | T | +-----------+---+---+---+---+ | daniele | F | F | F | F | +-----------+---+---+---+---+ | giorgia | F | F | T | T | +-----------+---+---+---+---+ **ticket organizations** *vittorino* :: vittorino_managed_organizations = customer_organizations.filter( projects__ticketproject__managers=vittorino ).distinct() [, ] vittorino_assigned_organizations = customer_organizations.filter( projects__ticketproject__staff=vittorino ).distinct() [, ] vittorino_visible_organizations = customer_organizations.filter( projects__ticketproject__customers=vittorino ).distinct() [] vittorino_ticket_organizations = customer_organizations.filter( Q(projects__ticketproject__managers=vittorino)| Q(projects__ticketproject__staff=vittorino)| Q(projects__ticketproject__customers=vittorino) ).distinct() [, , ] *luca* :: luca_managed_organizations = customer_organizations.filter( projects__ticketproject__managers=luca ).distinct() [] luca_assigned_organizations = customer_organizations.filter( projects__ticketproject__staff=luca ).distinct() [, ] luca_visible_organizations = customer_organizations.filter( projects__ticketproject__customers=luca ).distinct() [] luca_ticket_organizations = customer_organizations.filter( Q(projects__ticketproject__managers=luca)| Q(projects__ticketproject__staff=luca)| Q(projects__ticketproject__customers=luca) ).distinct() [] *daniele* :: daniele_managed_organizations = customer_organizations.filter( projects__ticketproject__managers=daniele ).distinct() [] daniele_assigned_organizations = customer_organizations.filter( projects__ticketproject__staff=daniele ).distinct() [] daniele_visible_organizations = customer_organizations.filter( projects__ticketproject__customers=daniele ).distinct() [] daniele_ticket_organizations = customer_organizations.filter( Q(projects__ticketproject__managers=daniele)| Q(projects__ticketproject__staff=daniele)| Q(projects__ticketproject__customers=daniele) ).distinct() [] *giorgia* :: giorgia_managed_organizations = customer_organizations.filter( projects__ticketproject__managers=giorgia ).distinct() [] giorgia_assigned_organizations = customer_organizations.filter( projects__ticketproject__staff=giorgia ).distinct() [] giorgia_visible_organizations = customer_organizations.filter( projects__ticketproject__customers=giorgia ).distinct() [] giorgia_ticket_organizations = customer_organizations.filter( Q(projects__ticketproject__managers=giorgia)| Q(projects__ticketproject__staff=giorgia)| Q(projects__ticketproject__customers=giorgia) ).distinct() [] **ticket projects** *vittorino* :: vittorino_managed_ticket_projects = active_ticket_projects.filter( managers=vittorino ).distinct() [ , , , ] vittorino_assigned_ticket_projects = active_ticket_projects.filter( staff=vittorino ).distinct() [ , , ] vittorino_visible_ticket_projects = active_ticket_projects.filter( customers=vittorino ).distinct() [] vittorino_ticket_projects = active_ticket_projects.filter( Q(managers=vittorino)| Q(staff=vittorino)| Q(customers=vittorino) ).distinct() [ , , , , ] *luca* :: luca_managed_ticket_projects = active_ticket_projects.filter( managers=luca ).distinct() [] luca_assigned_ticket_projects = active_ticket_projects.filter( staff=luca ).distinct() [, ] luca_visible_ticket_projects = active_ticket_projects.filter( customers=luca ).distinct() [] luca_ticket_projects = active_ticket_projects.filter( Q(managers=luca)| Q(staff=luca)| Q(customers=luca) ).distinct() [, ] *daniele* :: daniele_managed_ticket_projects = active_ticket_projects.filter( managers=daniele ).distinct() [] daniele_assigned_ticket_projects = active_ticket_projects.filter( staff=daniele ).distinct() [] daniele_visible_ticket_projects = active_ticket_projects.filter( customers=daniele ).distinct() [] daniele_ticket_projects = active_ticket_projects.filter( Q(managers=daniele)| Q(staff=daniele)| Q(customers=daniele) ).distinct() [] *giorgia* :: giorgia_managed_ticket_projects = active_ticket_projects.filter( managers=giorgia ).distinct() [] giorgia_assigned_ticket_projects = active_ticket_projects.filter( staff=giorgia ).distinct() giorgia_visible_ticket_projects = active_ticket_projects.filter( customers=giorgia ).distinct() [, ] giorgia_ticket_projects = active_ticket_projects.filter( Q(managers=giorgia)| Q(staff=giorgia)| Q(customers=giorgia) ).distinct() [, ]