From faaf52dc6b7b7f8b16be95274c3d6c1f36793818 Mon Sep 17 00:00:00 2001 From: "J.-S. Caux" <J.S.Caux@uva.nl> Date: Tue, 19 Feb 2019 08:52:48 +0100 Subject: [PATCH] Add model organizations.OrganizationEvent --- organizations/constants.py | 18 ++++++++++++ .../migrations/0004_organizationevent.py | 29 +++++++++++++++++++ organizations/models.py | 22 ++++++++++++-- partners/models.py | 6 ++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 organizations/migrations/0004_organizationevent.py diff --git a/organizations/constants.py b/organizations/constants.py index ba57d4e44..8b581b880 100644 --- a/organizations/constants.py +++ b/organizations/constants.py @@ -64,6 +64,24 @@ ORGANIZATION_STATUSES = ( (ORGSTATUS_OBSOLETE, 'Obsolete'), ) + +ORGANIZATION_EVENT_REQUESTED = 'requested' +ORGANIZATION_EVENT_COMMENT = 'comment' +ORGANIZATION_EVENT_EMAIL_SENT = 'email_sent' +ORGANIZATION_EVENT_INITIATE_NEGOTIATION = 'negotiating' +ORGANIZATION_EVENT_MARKED_AS_UNINTERESTED = 'marked_as_uninterested' +ORGANIZATION_EVENT_PROMOTED = 'promoted' +ORGANIZATION_STATUS_UPDATED = 'status_updated' +ORGANIZATION_EVENTS = ( + (ORGANIZATION_EVENT_REQUESTED, 'Requested (from online form)'), + (ORGANIZATION_EVENT_COMMENT, 'Comment added'), + (ORGANIZATION_EVENT_EMAIL_SENT, 'Email sent'), + (ORGANIZATION_EVENT_INITIATE_NEGOTIATION, 'Initiated negotiation'), + (ORGANIZATION_EVENT_MARKED_AS_UNINTERESTED, 'Marked as uninterested'), + (ORGANIZATION_EVENT_PROMOTED, 'Promoted to Sponsor'), + (ORGANIZATION_STATUS_UPDATED, 'Status updated'), +) + ROLE_GENERAL = 'gen' ROLE_TECH = 'tech' ROLE_FIN = 'fin' diff --git a/organizations/migrations/0004_organizationevent.py b/organizations/migrations/0004_organizationevent.py new file mode 100644 index 000000000..08f127935 --- /dev/null +++ b/organizations/migrations/0004_organizationevent.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2019-02-19 07:52 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('organizations', '0003_contact_contactperson_contactrole'), + ] + + operations = [ + migrations.CreateModel( + name='OrganizationEvent', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('event', models.CharField(choices=[('requested', 'Requested (from online form)'), ('comment', 'Comment added'), ('email_sent', 'Email sent'), ('negotiating', 'Initiated negotiation'), ('marked_as_uninterested', 'Marked as uninterested'), ('promoted', 'Promoted to Sponsor'), ('status_updated', 'Status updated')], max_length=64)), + ('comments', models.TextField(blank=True)), + ('noted_on', models.DateTimeField(auto_now_add=True)), + ('noted_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organizations.Organization')), + ], + ), + ] diff --git a/organizations/models.py b/organizations/models.py index fc5b30655..6fbdd9bc7 100644 --- a/organizations/models.py +++ b/organizations/models.py @@ -17,8 +17,7 @@ from django.urls import reverse from django_countries.fields import CountryField from .constants import ORGANIZATION_TYPES, ORGTYPE_PRIVATE_BENEFACTOR,\ - ORGANIZATION_STATUSES, ORGSTATUS_ACTIVE,\ - ROLE_KINDS + ORGANIZATION_STATUSES, ORGSTATUS_ACTIVE, ORGANIZATION_EVENTS, ROLE_KINDS from .managers import OrganizationQuerySet from scipost.constants import TITLE_CHOICES @@ -185,6 +184,25 @@ class Organization(models.Model): +################################### +# Events related to Organizations # +################################### + +class OrganizationEvent(models.Model): + """ + Documents an event related to an Organization. + """ + organization = models.ForeignKey('organizations.Organization', on_delete=models.CASCADE) + event = models.CharField(max_length=64, choices=ORGANIZATION_EVENTS) + comments = models.TextField(blank=True) + noted_on = models.DateTimeField(auto_now_add=True) + noted_by = models.ForeignKey(User, on_delete=models.CASCADE) + + def __str__(self): + return '%s: %s' % (str(self.organization), self.get_event_display()) + + + #################################### # Contact persons, users and roles # #################################### diff --git a/partners/models.py b/partners/models.py index 19ee9d0d6..39ea44207 100644 --- a/partners/models.py +++ b/partners/models.py @@ -47,6 +47,7 @@ now = timezone.now() # Prospective Partners # ######################## +# TODO: to be deleted, use Organization instead class ProspectivePartner(models.Model): """A prospect Partner is a Partner without explicit contract with SciPost yet.""" @@ -102,6 +103,7 @@ class ProspectiveContact(models.Model): return "%s %s %s" % (self.get_title_display(), self.first_name, self.last_name) +# TODO: delete, superseded by OrganizationEvent class ProspectivePartnerEvent(models.Model): prospartner = models.ForeignKey('partners.ProspectivePartner', on_delete=models.CASCADE) event = models.CharField(max_length=64, choices=PROSPECTIVE_PARTNER_EVENTS) @@ -204,6 +206,7 @@ class Contact(models.Model): return ', '.join([choices[value] for index, value in enumerate(self.kind)]) +# TODO: delete, use Organizations instead class Partner(models.Model): """ Supporting Partners. @@ -234,6 +237,7 @@ class Partner(models.Model): raise NotImplemented +# TODO: delete, superseded by OrganizationEvent class PartnerEvent(models.Model): partner = models.ForeignKey('partners.Partner', on_delete=models.CASCADE, related_name='events') @@ -246,6 +250,7 @@ class PartnerEvent(models.Model): return '%s: %s' % (str(self.partner), self.get_event_display()) +# TODO: delete, use finances.Subsidy instead class MembershipAgreement(models.Model): """ Agreement for membership of the Supporting Partners Board. @@ -271,6 +276,7 @@ class MembershipAgreement(models.Model): return reverse('partners:agreement_details', args=(self.id,)) +# TODO: delete, use finances.SubsidyAttachment instead class PartnersAttachment(models.Model): """ An Attachment which can (in the future) be related to a Partner, Contact, MembershipAgreement, -- GitLab