datatracker/ietf/wgrecord/utils.py

220 lines
6.6 KiB
Python

from django.conf import settings
import re
from datetime import datetime
from group.models import GroupEvent
from doc.models import Document, DocAlias, DocHistory, RelatedDocument, DocumentAuthor
from ietf.utils.history import find_history_active_at
def set_or_create_charter(wg):
try:
charter = Document.objects.get(docalias__name="charter-ietf-%s" % wg.acronym)
except Document.DoesNotExist:
charter = Document.objects.create(
name="charter-ietf-" + wg.acronym,
time=datetime.now(),
type_id="charter",
title=wg.name,
group=wg,
abstract=wg.name,
rev="",
)
# Create an alias as well
DocAlias.objects.create(
name = charter.name,
document = charter
)
if wg.charter != charter:
wg.charter = charter
wg.save()
return charter
def save_charter_in_history(charter):
'''This is a modified save_document_in_history that save the name
as charter-ietf-wgacronym with wgacronym being the current Group
acronym. The charter Document may have an old name which is no longer
in use'''
def get_model_fields_as_dict(obj):
return dict((field.name, getattr(obj, field.name))
for field in obj._meta.fields
if field is not obj._meta.pk)
# copy fields
fields = get_model_fields_as_dict(charter)
fields["doc"] = charter
fields["name"] = 'charter-ietf-%s' % charter.chartered_group.acronym
chist = DocHistory(**fields)
chist.save()
# copy many to many
for field in charter._meta.many_to_many:
if not field.rel.through:
# just add the attributes
rel = getattr(chist, field.name)
for item in getattr(charter, field.name).all():
rel.add(item)
# copy remaining tricky many to many
def transfer_fields(obj, HistModel):
mfields = get_model_fields_as_dict(item)
# map charter -> chist
for k, v in mfields.iteritems():
if v == charter:
mfields[k] = chist
HistModel.objects.create(**mfields)
for item in RelatedDocument.objects.filter(source=charter):
transfer_fields(item, RelatedDocHistory)
for item in DocumentAuthor.objects.filter(document=charter):
transfer_fields(item, DocHistoryAuthor)
return chist
def add_wg_comment(request, wg, text, ballot=None):
if request:
login = request.user.get_profile()
else:
login = None
e = GroupEvent(group=wg, type="added_comment", by=login)
e.desc = text
e.save()
def log_state_changed(request, doc, by, prev_state, note=''):
from doc.models import DocEvent
e = DocEvent(doc=doc, by=by)
e.type = "changed_document"
e.desc = u"State changed to <b>%s</b> from %s" % (
doc.charter_state.name,
prev_state.name if prev_state else "None")
if note:
e.desc += "<br>%s" % note
e.save()
return e
def log_group_state_changed(request, wg, by, note=''):
from group.models import GroupEvent
e = GroupEvent(group=wg, by=by)
if wg.state_id == "proposed":
e.type = "proposed"
elif wg.state_id == "active":
e.type = "started"
elif wg.state_id == "conclude":
e.type = "concluded"
e.desc = u"%s group" % e.type.capitalize()
if note:
e.desc += "<br>%s" % note
e.save()
return e
def log_info_changed(request, wg, by, type=None, note=''):
from group.models import GroupEvent
e = GroupEvent(group=wg, by=by)
e.type = "changed_record"
e.desc = u"Info changed"
if note:
e.desc += "<br>%s" % note
e.save()
return e
def get_charter_for_revision(charter, r):
if r == None:
return None
else:
l = list(charter.history_set.filter(rev=r).order_by('-time'))
if l != []:
return l[0]
else:
# Get the lastest history entry
l = list(charter.history_set.all().order_by('-time'))
if l != []:
class FakeHistory(object):
def __init__(self, name, rev, time):
self.name = name
self.rev = rev
self.time = time
return FakeHistory(l[0].name, charter.rev, charter.time)
else:
# no history, just return charter
return charter
def get_group_for_revision(wg, r):
if r == None:
return None
else:
l = list(wg.charter.history_set.filter(rev=r).order_by('-time'))
if l != []:
o = list(wg.history_set.filter(time__lte=l[0].time).order_by('-time'))
if o != []:
return o[0]
else:
return wg
else:
return wg
def prev_revision(rev):
m = re.match(r"(?P<major>[0-9][0-9])(-(?P<minor>[0-9][0-9]))?", rev)
if m.group('minor') and m.group('minor') != "00":
return "%s-%#02d" % (m.group('major'), int(m.group('minor')) - 1)
else:
return None
def next_revision(rev):
if rev == "":
return "00-00"
m = re.match(r"(?P<major>[0-9][0-9])(-(?P<minor>[0-9][0-9]))?", rev)
if m.group('minor'):
return "%s-%#02d" % (m.group('major'), int(m.group('minor')) + 1)
else:
return "%s-00" % (m.group('major'))
def approved_revision(rev):
if rev == "":
return ""
m = re.match(r"(?P<major>[0-9][0-9])(-(?P<minor>[0-9][0-9]))?", rev)
return m.group('major')
def next_approved_revision(rev):
if rev == "":
return "01"
m = re.match(r"(?P<major>[0-9][0-9])(-(?P<minor>[0-9][0-9]))?", rev)
return "%#02d" % (int(m.group('major')) + 1)
def update_telechat(request, doc, by, new_telechat_date):
from doc.models import TelechatDocEvent
on_agenda = bool(new_telechat_date)
prev = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
prev_telechat = prev.telechat_date if prev else None
prev_agenda = bool(prev_telechat)
e = TelechatDocEvent()
e.type = "scheduled_for_telechat"
e.by = by
e.doc = doc
e.telechat_date = new_telechat_date
if on_agenda != prev_agenda:
if on_agenda:
e.desc = "Placed on agenda for telechat - %s by %s" % (
new_telechat_date, by.name)
else:
e.desc = "Removed from agenda for telechat by %s" % by.name
elif on_agenda and new_telechat_date != prev_telechat:
e.desc = "Telechat date has been changed to <b>%s</b> from <b>%s</b> by %s" % (new_telechat_date, prev_telechat, by.name)
e.save()