Skip to content

Commit 754469c

Browse files
committed
Import remaining RfcIndex attributes, import IDAuthor, bug fixes
- Legacy-Id: 2738
1 parent 34d9f5f commit 754469c

12 files changed

Lines changed: 771 additions & 453 deletions

File tree

ietf/idrfc/idrfc_wrapper.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class IdWrapper:
8787

8888
def __init__(self, draft):
8989
self.id = self
90-
if isinstance(draft, IDInternal):
90+
if isinstance(draft, IDInternal) and not settings.USE_DB_REDESIGN_PROXY_CLASSES:
9191
self._idinternal = draft
9292
self._draft = self._idinternal.draft
9393
else:
@@ -261,10 +261,16 @@ def __init__(self, rfcindex, rfc=None, idinternal=None):
261261
self.rfc = self
262262

263263
if not self._idinternal:
264-
try:
265-
self._idinternal = IDInternal.objects.get(rfc_flag=1, draft=self._rfcindex.rfc_number)
266-
except IDInternal.DoesNotExist:
267-
pass
264+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
265+
pub = rfcindex.latest_event(type="published_rfc")
266+
started = rfcindex.latest_event(type="started_iesg_process")
267+
if pub and started and pub.time < started.time:
268+
self._idinternal = rfcindex
269+
else:
270+
try:
271+
self._idinternal = IDInternal.objects.get(rfc_flag=1, draft=self._rfcindex.rfc_number)
272+
except IDInternal.DoesNotExist:
273+
pass
268274

269275
if self._idinternal:
270276
self.ietf_process = IetfProcessData(self._idinternal)
@@ -275,7 +281,10 @@ def __init__(self, rfcindex, rfc=None, idinternal=None):
275281
self.maturity_level = self._rfcindex.current_status
276282
if not self.maturity_level:
277283
self.maturity_level = "Unknown"
278-
284+
285+
if settings.USE_DB_REDESIGN_PROXY_CLASSES and rfcindex.filename.startswith('rfc'):
286+
return # we've already done the lookup while importing so skip the rest
287+
279288
ids = InternetDraft.objects.filter(rfc_number=self.rfc_number)
280289
if len(ids) >= 1:
281290
self.draft_name = ids[0].filename
@@ -658,7 +667,6 @@ def _init(self):
658667
position="No Record",
659668
)
660669
positions.append(d)
661-
662670
self._positions = positions
663671

664672
def old_init(self):

ietf/idrfc/views_doc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def _get_history(doc, versions):
199199
results.insert(0, v)
200200
if doc.is_id_wrapper and doc.draft_status == "Expired" and doc._draft.expiration_date:
201201
results.append({'is_text':True, 'date':doc._draft.expiration_date, 'text':'Draft expired'})
202-
if doc.is_rfc_wrapper:
202+
if not settings.USE_DB_REDESIGN_PROXY_CLASSES and doc.is_rfc_wrapper:
203203
if doc.draft_name:
204204
text = 'RFC Published (see <a href="/doc/%s/">%s</a> for earlier history)' % (doc.draft_name,doc.draft_name)
205205
else:

ietf/idtracker/admin.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ class AcronymAdmin(admin.ModelAdmin):
88
list_display=('acronym', 'name')
99
admin.site.register(Acronym, AcronymAdmin)
1010

11-
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
1211
class AreaAdmin(admin.ModelAdmin):
1312
list_display=('area_acronym', 'status')
1413
admin.site.register(Area, AreaAdmin)
@@ -25,9 +24,10 @@ class AreaWGURLAdmin(admin.ModelAdmin):
2524
pass
2625
admin.site.register(AreaWGURL, AreaWGURLAdmin)
2726

28-
class BallotInfoAdmin(admin.ModelAdmin):
29-
pass
30-
admin.site.register(BallotInfo, BallotInfoAdmin)
27+
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
28+
class BallotInfoAdmin(admin.ModelAdmin):
29+
pass
30+
admin.site.register(BallotInfo, BallotInfoAdmin)
3131

3232
class ChairsHistoryAdmin(admin.ModelAdmin):
3333
list_display=('person', 'chair_type', 'start_year', 'end_year')
@@ -52,12 +52,13 @@ class IDIntendedStatusAdmin(admin.ModelAdmin):
5252
pass
5353
admin.site.register(IDIntendedStatus, IDIntendedStatusAdmin)
5454

55-
class IDInternalAdmin(admin.ModelAdmin):
56-
ordering=['draft']
57-
list_display=['draft', 'token_email', 'note']
58-
search_fields=['draft__filename']
59-
raw_id_fields=['draft','ballot']
60-
admin.site.register(IDInternal, IDInternalAdmin)
55+
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
56+
class IDInternalAdmin(admin.ModelAdmin):
57+
ordering=['draft']
58+
list_display=['draft', 'token_email', 'note']
59+
search_fields=['draft__filename']
60+
raw_id_fields=['draft','ballot']
61+
admin.site.register(IDInternal, IDInternalAdmin)
6162

6263
class IDNextStateAdmin(admin.ModelAdmin):
6364
pass

ietf/idtracker/models.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -264,19 +264,12 @@ def __unicode__(self):
264264
if self.first_name == '' and self.last_name == '':
265265
return u"(Person #%s)" % self.person_or_org_tag
266266
return u"%s %s" % ( self.first_name or u"<nofirst>", self.last_name or u"<nolast>")
267-
def email(self, priority=1, type=None):
268-
name = str(self)
267+
def email(self, priority=1):
268+
name = unicode(self)
269269
email = ''
270-
types = type and [ type ] or [ "INET", "Prim", None ]
271-
for type in types:
272-
try:
273-
if type:
274-
email = self.emailaddress_set.get(priority=priority, type=type).address
275-
else:
276-
email = self.emailaddress_set.get(priority=priority).address
277-
break
278-
except (EmailAddress.DoesNotExist, AssertionError):
279-
pass
270+
addresses = self.emailaddress_set.filter(address__contains="@").order_by('priority')[:1]
271+
if addresses:
272+
email = addresses[0].address.replace('<', '').replace('>', '')
280273
return (name, email)
281274
# Added by Sunny Lee to display person's affiliation - 5/26/2007
282275
def affiliation(self, priority=1):
@@ -1088,7 +1081,12 @@ def __init__(self, document):
10881081
self.document = document
10891082

10901083
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
1091-
from redesign.doc.proxy import InternetDraft
1084+
InternetDraftOld = InternetDraft
1085+
IDInternalOld = IDInternal
1086+
BallotInfoOld = BallotInfo
1087+
AreaOld = Area
1088+
AcronymOld = Acronym
1089+
from redesign.doc.proxy import InternetDraft, IDInternal, BallotInfo
10921090
from redesign.group.proxy import Area
10931091
from redesign.group.proxy import Acronym
10941092

redesign/doc/models.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ class DocumentInfo(models.Model):
2727
abstract = models.TextField()
2828
rev = models.CharField(max_length=16)
2929
pages = models.IntegerField(blank=True, null=True)
30-
intended_std_level = models.ForeignKey(IntendedStatusName, blank=True, null=True)
31-
std_level = models.ForeignKey(StdStatusName, blank=True, null=True)
32-
authors = models.ManyToManyField(Email, blank=True, null=True)
30+
intended_std_level = models.ForeignKey(IntendedStdLevelName, blank=True, null=True)
31+
std_level = models.ForeignKey(StdLevelName, blank=True, null=True)
3332
ad = models.ForeignKey(Email, related_name='ad_%(class)s_set', blank=True, null=True)
3433
shepherd = models.ForeignKey(Email, related_name='shepherd_%(class)s_set', blank=True, null=True)
3534
notify = models.CharField(max_length=255, blank=True)
@@ -42,9 +41,10 @@ class Meta:
4241
def author_list(self):
4342
return ", ".join(email.address for email in self.authors.all())
4443
def latest_event(self, *args, **filter_args):
45-
"""Get latest event with specific requirements, e.g.
46-
d.latest_event(type="xyz") returns an Event while
47-
d.latest_event(Status, type="xyz") returns a Status event."""
44+
"""Get latest event of optional Python type and with filter
45+
arguments, e.g. d.latest_event(type="xyz") returns an Event
46+
while d.latest_event(Status, type="xyz") returns a Status
47+
event."""
4848
model = args[0] if args else Event
4949
e = model.objects.filter(doc=self).filter(**filter_args).order_by('-time')[:1]
5050
return e[0] if e else None
@@ -56,9 +56,21 @@ class RelatedDocument(models.Model):
5656
def __unicode__(self):
5757
return u"%s %s %s" % (self.document.name, self.relationship.name.lower(), self.doc_alias.name)
5858

59+
class DocumentAuthor(models.Model):
60+
document = models.ForeignKey('Document')
61+
author = models.ForeignKey(Email)
62+
order = models.IntegerField()
63+
64+
def __unicode__(self):
65+
return u"%s %s (%s)" % (self.document.name, self.email.get_name(), self.order)
66+
67+
class Meta:
68+
ordering = ["document", "order"]
69+
5970
class Document(DocumentInfo):
6071
name = models.CharField(max_length=255, primary_key=True) # immutable
6172
related = models.ManyToManyField('DocAlias', through=RelatedDocument, blank=True, related_name="reversely_related_document_set")
73+
authors = models.ManyToManyField(Email, through=DocumentAuthor, blank=True)
6274
def __unicode__(self):
6375
return self.name
6476
def values(self):
@@ -89,7 +101,7 @@ def save_with_history(self, force_insert=False, force_update=False):
89101
snap = DocHistory(**fields)
90102
snap.save()
91103
for m in many2many:
92-
# FIXME: check that this works with related
104+
# FIXME: check that this works with related/authors
93105
#print "m2m:", m, many2many[m]
94106
rel = getattr(snap, m)
95107
for item in many2many[m]:
@@ -107,11 +119,23 @@ class RelatedDocHistory(models.Model):
107119
doc_alias = models.ForeignKey('DocAlias', related_name="reversely_related_document_history_set") # target
108120
relationship = models.ForeignKey(DocRelationshipName)
109121
def __unicode__(self):
110-
return u"%s %s %s" % (self.document.name, self.relationship.name.lower(), self.doc_alias.name)
122+
return u"%s %s %s" % (self.document.doc.name, self.relationship.name.lower(), self.doc_alias.name)
111123

124+
class DocHistoryAuthor(models.Model):
125+
document = models.ForeignKey('DocHistory')
126+
author = models.ForeignKey(Email)
127+
order = models.IntegerField()
128+
129+
def __unicode__(self):
130+
return u"%s %s (%s)" % (self.document.doc.name, self.email.get_name(), self.order)
131+
132+
class Meta:
133+
ordering = ["document", "order"]
134+
112135
class DocHistory(DocumentInfo):
113136
doc = models.ForeignKey(Document) # ID of the Document this relates to
114137
related = models.ManyToManyField('DocAlias', through=RelatedDocHistory, blank=True)
138+
authors = models.ManyToManyField(Email, through=DocHistoryAuthor, blank=True)
115139
def __unicode__(self):
116140
return unicode(self.doc.name)
117141

@@ -169,6 +193,7 @@ class SendQueue(models.Model):
169193
("published_rfc", "Published RFC"),
170194

171195
# IESG events
196+
("started_iesg_process", "Started IESG process on document"),
172197
("sent_ballot_announcement", "Sent ballot announcement"),
173198
("changed_ballot_position", "Changed ballot position"),
174199
("changed_ballot_approval_text", "Changed ballot approval text"),

redesign/doc/proxy.py

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,19 @@ def revision(self):
4444
def revision_date(self):
4545
e = self.latest_event(type="new_revision")
4646
return e.time.date() if e else None
47-
#file_type = models.CharField(max_length=20)
48-
@property
49-
def file_type(self):
50-
matches = glob.glob(os.path.join(settings.INTERNET_DRAFT_PATH, self.name + "*.*"))
47+
# helper function
48+
def get_file_type_matches_from(self, glob_path):
5149
possible_types = [".txt", ".pdf", ".xml", ".ps"]
52-
res = set()
53-
for m in matches:
50+
res = []
51+
for m in glob.glob(glob_path):
5452
for t in possible_types:
5553
if m.endswith(t):
56-
res.add(t)
57-
return ",".join(res) or ".txt"
54+
res.append(t)
55+
return ",".join(res)
56+
#file_type = models.CharField(max_length=20)
57+
@property
58+
def file_type(self):
59+
return self.get_file_type_matches_from(os.path.join(settings.INTERNET_DRAFT_PATH, self.name + "-" + self.rev + ".*")) or ".txt"
5860
#txt_page_count = models.IntegerField()
5961
@property
6062
def txt_page_count(self):
@@ -160,8 +162,15 @@ def expired_tombstone(self):
160162
#idinternal = FKAsOneToOne('idinternal', reverse=True, query=models.Q(rfc_flag = 0))
161163
@property
162164
def idinternal(self):
165+
print self.iesg_state
163166
return self if self.iesg_state else None
164167

168+
# reverse relationship
169+
@property
170+
def authors(self):
171+
from person.models import Person
172+
return IDAuthor.objects.filter(document=self)
173+
165174
# methods from InternetDraft
166175
def displayname(self):
167176
return self.name
@@ -554,7 +563,7 @@ def needed(self, standardsTrack=True):
554563

555564
#rfc_number = models.IntegerField(primary_key=True) # already taken care of
556565
#title = models.CharField(max_length=250) # same name
557-
#authors = models.CharField(max_length=250) FIXME
566+
#authors = models.CharField(max_length=250) # exists already
558567
#rfc_published_date = models.DateField()
559568
@property
560569
def rfc_published_date(self):
@@ -564,7 +573,7 @@ def rfc_published_date(self):
564573
#current_status = models.CharField(max_length=50,null=True)
565574
@property
566575
def current_status(self):
567-
return self.std_level
576+
return self.std_level.name
568577

569578
#updates = models.CharField(max_length=200,blank=True,null=True)
570579
@property
@@ -594,26 +603,54 @@ def also(self):
594603
models.Q(name__startswith="bcp"))
595604
return aliases[0].name.upper() if aliases else None
596605

597-
#draft = models.CharField(max_length=200,null=True)
598-
@property
599-
def draft(self):
600-
if not self.name.startswith("rfc"):
601-
return self.name
602-
else:
603-
return None
606+
#draft = models.CharField(max_length=200,null=True) # have to ignore this, it's already implemented
604607

605-
#has_errata = models.BooleanField() FIXME
608+
#has_errata = models.BooleanField()
609+
@property
610+
def has_errata(self):
611+
return bool(self.tags.filter(slug="errata"))
612+
606613
#stream = models.CharField(max_length=15,blank=True,null=True)
607614
@property
608615
def stream(self):
609616
return super(InternetDraft, self).stream.name
610-
#wg = models.CharField(max_length=15,blank=True,null=True) FIXME
617+
618+
#wg = models.CharField(max_length=15,blank=True,null=True)
619+
@property
620+
def wg(self):
621+
return self.group.acronym
622+
611623
#file_formats = models.CharField(max_length=20,blank=True,null=True)
612624
@property
613625
def file_formats(self):
614-
return self.file_type.replace(".", "").replace("txt", "ascii")
626+
return self.get_file_type_matches_from(os.path.join(settings.RFC_PATH, "rfc" + str(self.rfc_number) + ".*")).replace(".", "").replace("txt", "ascii")
615627

616628
class Meta:
617629
proxy = True
618630

631+
IDInternal = InternetDraft
632+
BallotInfo = InternetDraft
619633
RfcIndex = InternetDraft
634+
635+
636+
class IDAuthor(DocumentAuthor):
637+
#document = models.ForeignKey(InternetDraft, db_column='id_document_tag', related_name='authors') # same name
638+
#person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag')
639+
@property
640+
def person(self):
641+
return self.author.person
642+
643+
#author_order = models.IntegerField()
644+
@property
645+
def author_order(self):
646+
return self.order
647+
648+
def email(self):
649+
return self.author.address
650+
651+
def final_author_order(self):
652+
return self.order
653+
654+
class Meta:
655+
proxy = True
656+

0 commit comments

Comments
 (0)