|
3 | 3 |
|
4 | 4 | from datetime import datetime |
5 | 5 | from group.models import GroupEvent |
6 | | -from doc.models import Document |
| 6 | +from doc.models import Document, DocAlias, DocHistory, RelatedDocument, DocumentAuthor |
7 | 7 | from ietf.utils.history import find_history_active_at |
8 | 8 |
|
9 | 9 | def set_or_create_charter(wg): |
10 | 10 | try: |
11 | | - charter = Document.objects.get(name="charter-ietf-" + wg.acronym) |
| 11 | + charter = Document.objects.get(docalias__name="charter-ietf-%s" % wg.acronym) |
12 | 12 | except Document.DoesNotExist: |
13 | 13 | charter = Document.objects.create( |
14 | | - name="charter-ietf-%s" % wg.acronym, |
| 14 | + name="charter-ietf-" + wg.acronym, |
15 | 15 | time=datetime.now(), |
16 | 16 | type_id="charter", |
17 | 17 | title=wg.name, |
18 | 18 | group=wg, |
19 | 19 | abstract=wg.name, |
20 | 20 | rev="", |
21 | 21 | ) |
22 | | - wg.charter = charter |
23 | | - wg.save() |
| 22 | + # Create an alias as well |
| 23 | + DocAlias.objects.create( |
| 24 | + name = charter.name, |
| 25 | + document = charter |
| 26 | + ) |
| 27 | + if wg.charter != charter: |
| 28 | + wg.charter = charter |
| 29 | + wg.save() |
24 | 30 | return charter |
25 | 31 |
|
| 32 | +def save_charter_in_history(charter): |
| 33 | + '''This is a modified save_document_in_history that save the name |
| 34 | + as charter-ietf-wgacronym with wgacronym being the current Group |
| 35 | + acronym. The charter Document may have an old name which is no longer |
| 36 | + in use''' |
| 37 | + def get_model_fields_as_dict(obj): |
| 38 | + return dict((field.name, getattr(obj, field.name)) |
| 39 | + for field in obj._meta.fields |
| 40 | + if field is not obj._meta.pk) |
| 41 | + |
| 42 | + # copy fields |
| 43 | + fields = get_model_fields_as_dict(charter) |
| 44 | + fields["doc"] = charter |
| 45 | + fields["name"] = 'charter-ietf-%s' % charter.chartered_group.acronym |
| 46 | + |
| 47 | + chist = DocHistory(**fields) |
| 48 | + chist.save() |
| 49 | + |
| 50 | + # copy many to many |
| 51 | + for field in charter._meta.many_to_many: |
| 52 | + if not field.rel.through: |
| 53 | + # just add the attributes |
| 54 | + rel = getattr(chist, field.name) |
| 55 | + for item in getattr(charter, field.name).all(): |
| 56 | + rel.add(item) |
| 57 | + |
| 58 | + # copy remaining tricky many to many |
| 59 | + def transfer_fields(obj, HistModel): |
| 60 | + mfields = get_model_fields_as_dict(item) |
| 61 | + # map charter -> chist |
| 62 | + for k, v in mfields.iteritems(): |
| 63 | + if v == charter: |
| 64 | + mfields[k] = chist |
| 65 | + HistModel.objects.create(**mfields) |
| 66 | + |
| 67 | + for item in RelatedDocument.objects.filter(source=charter): |
| 68 | + transfer_fields(item, RelatedDocHistory) |
| 69 | + |
| 70 | + for item in DocumentAuthor.objects.filter(document=charter): |
| 71 | + transfer_fields(item, DocHistoryAuthor) |
| 72 | + |
| 73 | + return chist |
| 74 | + |
| 75 | + |
26 | 76 | def add_wg_comment(request, wg, text, ballot=None): |
27 | 77 | if request: |
28 | 78 | login = request.user.get_profile() |
@@ -86,7 +136,19 @@ def get_charter_for_revision(charter, r): |
86 | 136 | if l != []: |
87 | 137 | return l[0] |
88 | 138 | else: |
89 | | - return charter |
| 139 | + # Get the lastest history entry |
| 140 | + l = list(charter.history_set.all().order_by('-time')) |
| 141 | + if l != []: |
| 142 | + class FakeHistory(object): |
| 143 | + def __init__(self, name, rev, time): |
| 144 | + self.name = name |
| 145 | + self.rev = rev |
| 146 | + self.time = time |
| 147 | + |
| 148 | + return FakeHistory(l[0].name, charter.rev, charter.time) |
| 149 | + else: |
| 150 | + # no history, just return charter |
| 151 | + return charter |
90 | 152 |
|
91 | 153 | def get_group_for_revision(wg, r): |
92 | 154 | if r == None: |
@@ -118,6 +180,12 @@ def next_revision(rev): |
118 | 180 | else: |
119 | 181 | return "%s-00" % (m.group('major')) |
120 | 182 |
|
| 183 | +def approved_revision(rev): |
| 184 | + if rev == "": |
| 185 | + return "" |
| 186 | + m = re.match(r"(?P<major>[0-9][0-9])(-(?P<minor>[0-9][0-9]))?", rev) |
| 187 | + return m.group('major') |
| 188 | + |
121 | 189 | def next_approved_revision(rev): |
122 | 190 | if rev == "": |
123 | 191 | return "01" |
|
0 commit comments