diff --git a/ietf/meeting/proxy.py b/ietf/meeting/proxy.py index d1e206494..e9d0a534b 100644 --- a/ietf/meeting/proxy.py +++ b/ietf/meeting/proxy.py @@ -360,7 +360,7 @@ class WgMeetingSessionProxy(TimeSlot): return "%s at %s" % (self.acronym(), self.meeting) def agenda_file(self,interimvar=0): if not hasattr(self, '_agenda_file'): - docs = self.materials.filter(type="agenda") + docs = self.materials.filter(type="agenda", states__type="agenda", states__slug="active") if not docs: return "" @@ -371,7 +371,7 @@ class WgMeetingSessionProxy(TimeSlot): return self._agenda_file def minute_file(self,interimvar=0): - docs = self.materials.filter(type="minutes") + docs = self.materials.filter(type="minutes", states__type="minutes", states__slug="active") if not docs: return "" @@ -410,7 +410,7 @@ class WgMeetingSessionProxy(TimeSlot): return "plenaryw" if "Technical" in self.name: return "plenaryt" - for m in self.materials.filter(type="agenda"): + for m in self.materials.filter(type="agenda", states__type="agenda", states__slug="active"): if "plenaryw" in m.name: return "plenaryw" if "plenaryt" in m.name: diff --git a/redesign/doc/models.py b/redesign/doc/models.py index fb71c6057..ac3c24914 100644 --- a/redesign/doc/models.py +++ b/redesign/doc/models.py @@ -266,10 +266,13 @@ EVENT_TYPES = [ # core events ("new_revision", "Added new revision"), ("changed_document", "Changed document metadata"), - - # misc document events - ("changed_stream", "Changed document stream"), ("added_comment", "Added comment"), + + ("uploaded", "Uploaded document"), + ("deleted", "Deleted document"), + + # misc draft/RFC events + ("changed_stream", "Changed document stream"), ("expired_document", "Expired document"), ("requested_resurrect", "Requested resurrect"), ("completed_resurrect", "Completed resurrect"), diff --git a/redesign/importing/import-docs.py b/redesign/importing/import-docs.py index 1011c2f71..e59720879 100755 --- a/redesign/importing/import-docs.py +++ b/redesign/importing/import-docs.py @@ -17,7 +17,7 @@ from redesign.doc.models import * from redesign.doc.utils import get_tags_for_stream_id from redesign.group.models import * from redesign.name.models import * -from redesign.importing.utils import old_person_to_person, person_name +from redesign.importing.utils import old_person_to_person, person_name, dont_save_queries from redesign.name.utils import name from ietf.idtracker.models import InternetDraft, IDInternal, IESGLogin, DocumentComment, PersonOrOrgInfo, Rfc, IESGComment, IESGDiscuss, BallotInfo, Position from ietf.idrfc.models import RfcIndex, DraftVersions @@ -30,13 +30,7 @@ document_name_to_import = None if len(sys.argv) > 1: document_name_to_import = sys.argv[1] -# prevent memory from leaking when settings.DEBUG=True -from django.db import connection -class DontSaveQueries(object): - def append(self, x): - pass -connection.queries = DontSaveQueries() - +dont_save_queries() # assumptions: # - states have been imported @@ -779,7 +773,7 @@ def import_from_idinternal(d, idinternal): -all_drafts = InternetDraft.objects.all().select_related() +all_drafts = InternetDraft.objects.all().order_by('pk').select_related() if document_name_to_import: if document_name_to_import.startswith("rfc"): all_drafts = all_drafts.filter(rfc_number=document_name_to_import[3:]) @@ -1047,7 +1041,7 @@ def get_or_create_rfc_document(rfc_number): return (d, alias) -all_rfcs = RfcIndex.objects.all() +all_rfcs = RfcIndex.objects.all().order_by("rfc_number") if all_drafts.count() != InternetDraft.objects.count(): if document_name_to_import and document_name_to_import.startswith("rfc"): diff --git a/redesign/importing/import-meetings.py b/redesign/importing/import-meetings.py index 9060a4832..b7ca3bc26 100755 --- a/redesign/importing/import-meetings.py +++ b/redesign/importing/import-meetings.py @@ -13,17 +13,22 @@ management.setup_environ(settings) from django.template.defaultfilters import slugify -from ietf.idtracker.models import AreaDirector, IETFWG, Acronym, IRTF +import datetime + +from ietf.idtracker.models import AreaDirector, IETFWG, Acronym, IRTF, PersonOrOrgInfo from ietf.meeting.models import * -from ietf.proceedings.models import Meeting as MeetingOld, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda, Minute, Slide +from ietf.proceedings.models import Meeting as MeetingOld, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda, Minute, Slide, WgProceedingsActivities from redesign.person.models import * -from redesign.doc.models import Document, DocAlias -from redesign.importing.utils import get_or_create_email, old_person_to_person +from redesign.doc.models import Document, DocAlias, State, DocEvent +from redesign.importing.utils import old_person_to_person, dont_save_queries from redesign.name.models import * from redesign.name.utils import name +dont_save_queries() -# imports Meeting, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda, Minute, Slide +# imports Meeting, MeetingVenue, MeetingRoom, NonSession, +# WgMeetingSession, WgAgenda, Minute, Slide, upload events from +# WgProceedingsActivities # assumptions: # - persons have been imported @@ -198,7 +203,7 @@ def import_materials(wg_meeting_session, timeslot=None, session=None): session_name = timeslot.name if kind == Slide: - d.title = o.slide_name + d.title = o.slide_name.strip() l = o.file_loc() d.external_url = l[l.find("slides/") + len("slides/"):] d.order = o.order_num or 1 @@ -209,16 +214,43 @@ def import_materials(wg_meeting_session, timeslot=None, session=None): d.group = session.group if session else None d.save() + + d.set_state(State.objects.get(type=doctype, slug="active")) DocAlias.objects.get_or_create(document=d, name=name) materials.add(d) + # try to create a doc event to figure out who uploaded it + t = d.type_id + if d.type_id == "slides": + t = "slide, '%s" % d.title + activities = WgProceedingsActivities.objects.filter(group_acronym=wg_meeting_session.group_acronym_id, + meeting=wg_meeting_session.meeting_id, + activity__startswith=t, + activity__endswith="was uploaded")[:1] + if activities: + a = activities[0] + try: + e = DocEvent.objects.get(doc=d, type="uploaded") + except DocEvent.DoesNotExist: + e = DocEvent(doc=d, type="uploaded") + e.time = datetime.datetime.combine(a.act_date, datetime.time(*[int(s) for s in a.act_time.split(":")])) + try: + e.by = old_person_to_person(a.act_by) or system_person + except PersonOrOrgInfo.DoesNotExist: + e.by = system_person + e.desc = u"Uploaded %s" % d.type_id + e.save() + else: + print "NO UPLOAD ACTIVITY RECORD for", d.name, t, wg_meeting_session.group_acronym_id, wg_meeting_session.meeting_id + + import_material_kind(WgAgenda, agenda_doctype) import_material_kind(Minute, minutes_doctype) import_material_kind(Slide, slides_doctype) -for o in WgMeetingSession.objects.all().order_by("pk"): +for o in WgMeetingSession.objects.all().order_by("pk").iterator(): # num_session is unfortunately not quite reliable, seems to be # right for 1 or 2 but not 3 and it's sometimes null sessions = o.num_session or 1 @@ -336,7 +368,7 @@ for o in WgMeetingSession.objects.all().order_by("pk"): # status id, third session required AD approval), # combined_room_id1/2, combined_time_id1/2 -for o in NonSession.objects.all().order_by('pk').select_related("meeting"): +for o in NonSession.objects.all().order_by('pk').select_related("meeting").iterator(): print "importing NonSession", o.pk if o.time_desc in ("", "0"): diff --git a/redesign/importing/import-persons.py b/redesign/importing/import-persons.py index 7ea08754d..4dee92848 100755 --- a/redesign/importing/import-persons.py +++ b/redesign/importing/import-persons.py @@ -22,7 +22,8 @@ from redesign.importing.utils import * # imports AreaDirector persons that are connected to an IETFWG, # persons from IDAuthor, announcement originators from Announcements, # requesters from WgMeetingSession, LiaisonDetail persons, -# LiaisonManagers/SDOAuthorizedIndividual persons +# LiaisonManagers/SDOAuthorizedIndividual persons, +# WgProceedingsActivities persons # should probably import # PersonOrOrgInfo/PostalAddress/EmailAddress/PhoneNumber fully @@ -162,6 +163,12 @@ for o in LiaisonDetail.objects.exclude(person=None).order_by("pk"): addr = o.from_email().address possibly_import_other_priority_email(email, addr) +# WgProceedingsActivities persons +for o in PersonOrOrgInfo.objects.filter(wgproceedingsactivities__id__gte=1).order_by("pk").distinct(): + print "importing WgProceedingsActivities person", o.pk, o.first_name.encode('utf-8'), o.last_name.encode('utf-8') + + email = get_or_create_email(o, create_fake=True) + # IDAuthor persons for o in IDAuthor.objects.all().order_by('id').select_related('person').iterator(): print "importing IDAuthor", o.id, o.person_id, o.person.first_name.encode('utf-8'), o.person.last_name.encode('utf-8') diff --git a/redesign/importing/import-states.py b/redesign/importing/import-states.py index a113479da..970618350 100755 --- a/redesign/importing/import-states.py +++ b/redesign/importing/import-states.py @@ -30,6 +30,11 @@ irtf_type, _ = StateType.objects.get_or_create(slug="draft-stream-irtf", label=" ise_type, _ = StateType.objects.get_or_create(slug="draft-stream-ise", label="ISE state") iab_type, _ = StateType.objects.get_or_create(slug="draft-stream-iab", label="IAB state") +slides_type, _ = StateType.objects.get_or_create(slug="slides", label="State") +minutes_type, _ = StateType.objects.get_or_create(slug="minutes", label="State") +agenda_type, _ = StateType.objects.get_or_create(slug="agenda", label="State") +liaison_att_type, _ = StateType.objects.get_or_create(slug="liai-att", label="State") + # draft states print "Importing draft states" State.objects.get_or_create(type=draft_type, slug="active", name="Active", order=1) @@ -168,3 +173,10 @@ for state_type, workflow in workflows: print "MISSING state", name, "in workflow", workflow.name continue s.next_states = [states[t.destination.name] for t in o.transitions.filter(workflow=workflow)] + + +# meeting material states +for t in (slides_type, minutes_type, agenda_type): + print "importing states for", t.slug + State.objects.get_or_create(type=t, slug="active", name="Active", order=1) + State.objects.get_or_create(type=t, slug="deleted", name="Deleted", order=2)