Skip to content

Commit 380c24d

Browse files
committed
Fix some import/proxy bugs that have turned up after a comparison test between non-proxied and proxied JSON generation, mostly relating to ballots registered by the Secretariat
- Legacy-Id: 2740
1 parent 644c7fc commit 380c24d

7 files changed

Lines changed: 254 additions & 78 deletions

File tree

ietf/idrfc/idrfc_wrapper.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ def iesg_ballot(self):
406406
# don't call this unless has_[active_]iesg_ballot returns True
407407
def iesg_ballot_needed( self ):
408408
standardsTrack = 'Standard' in self.intended_maturity_level() or \
409-
self.intended_maturity_level() == "BCP"
409+
self.intended_maturity_level() in ("BCP", "Best Current Practice")
410410
return self.iesg_ballot().ballot.needed( standardsTrack )
411411

412412
def ad_name(self):
@@ -424,6 +424,17 @@ def iesg_note(self):
424424

425425
def state_date(self):
426426
try:
427+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
428+
return self._idinternal.event_set.filter(
429+
Q(desc__istartswith="Draft Added by ")|
430+
Q(desc__istartswith="Draft Added in state ")|
431+
Q(desc__istartswith="Draft added in state ")|
432+
Q(desc__istartswith="State changed to ")|
433+
Q(desc__istartswith="State Changes to ")|
434+
Q(desc__istartswith="Sub state has been changed to ")|
435+
Q(desc__istartswith="State has been changed to ")|
436+
Q(desc__istartswith="IESG has approved and state has been changed to")).order_by('-time')[0].time.date()
437+
427438
return self._idinternal.comments().filter(
428439
Q(comment_text__istartswith="Draft Added by ")|
429440
Q(comment_text__istartswith="Draft Added in state ")|
@@ -625,8 +636,8 @@ def _init(self):
625636
positions = []
626637
seen = {}
627638

628-
for pos in self.ballot.event_set.filter(type="changed_ballot_position").select_related('pos', 'ad').order_by("-time", '-id'):
629-
pos = pos.ballotposition
639+
from doc.models import BallotPosition
640+
for pos in BallotPosition.objects.filter(doc=self.ballot, type="changed_ballot_position").select_related('ad').order_by("-time", '-id'):
630641
if pos.ad not in seen:
631642
p = dict(ad_name=pos.ad.get_name(),
632643
ad_username="", # FIXME: don't seem to have username at the moment

ietf/idrfc/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,5 @@ class Meta:
100100

101101
from django.conf import settings
102102
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
103+
RfcIndexOld = RfcIndex
103104
from redesign.doc.proxy import RfcIndex

ietf/idrfc/views_doc.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def _get_history(doc, versions):
150150
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
151151
versions = [] # clear versions
152152
event_holder = doc._draft if hasattr(doc, "_draft") else doc._rfcindex
153-
for e in event_holder.event_set.all().select_related('by').order_by('-time'):
153+
for e in event_holder.event_set.all().select_related('by').order_by('-time', '-id'):
154154
info = {}
155155
if e.type == "new_revision":
156156
filename = u"%s-%s" % (e.doc.name, e.newrevision.rev)
@@ -166,6 +166,9 @@ def _get_history(doc, versions):
166166
results.append({'comment':e, 'info':info, 'date':e.time, 'is_com':True})
167167

168168
prev_rev = "00"
169+
# actually, we're already sorted and this ruins the sort from
170+
# the ids which is sometimes needed, so the function should be
171+
# rewritten to not rely on a resort
169172
results.sort(key=lambda x: x['date'])
170173
for o in results:
171174
e = o["comment"]
@@ -236,6 +239,19 @@ def _get_versions(draft, include_replaced=True):
236239
def get_ballot(name):
237240
r = re.compile("^rfc([1-9][0-9]*)$")
238241
m = r.match(name)
242+
243+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
244+
from doc.models import DocAlias
245+
alias = get_object_or_404(DocAlias, name=name)
246+
d = get_object_or_404(InternetDraft, name=alias.document.name)
247+
try:
248+
if not d.ballot.ballot_issued:
249+
raise Http404
250+
except BallotInfo.DoesNotExist:
251+
raise Http404
252+
253+
return (BallotWrapper(d), RfcWrapper(d) if m else IdWrapper(d))
254+
239255
if m:
240256
rfc_number = int(m.group(1))
241257
rfci = get_object_or_404(RfcIndex, rfc_number=rfc_number)

redesign/doc/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def latest_event(self, *args, **filter_args):
4646
while d.latest_event(Status, type="xyz") returns a Status
4747
event."""
4848
model = args[0] if args else Event
49-
e = model.objects.filter(doc=self).filter(**filter_args).order_by('-time')[:1]
49+
e = model.objects.filter(doc=self).filter(**filter_args).order_by('-time', '-id')[:1]
5050
return e[0] if e else None
5151

5252
class RelatedDocument(models.Model):

redesign/doc/proxy.py

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
class InternetDraft(Document):
1111
objects = TranslatingManager(dict(filename="name",
1212
id_document_tag="id",
13-
status="state",
14-
rfc_number=lambda v: ("docalias__name", "rfc%s" % v)))
13+
status=lambda v: ("state", { 1: 'active', 2: 'expired', 3: 'rfc', 4: 'auth-rm', 5: 'repl', 6: 'ietf-rm'}),
14+
job_owner="ad",
15+
rfc_number=lambda v: ("docalias__name", "rfc%s" % v),
16+
))
1517

1618
DAYS_TO_EXPIRE=185
1719

@@ -94,7 +96,7 @@ def intended_status(self):
9496
@property
9597
def lc_sent_date(self):
9698
e = self.latest_event(type="sent_last_call")
97-
return e.time if e else None
99+
return e.time.date() if e else None
98100

99101
#lc_changes = models.CharField(max_length=3) # used in DB, unused in Django code?
100102

@@ -108,7 +110,7 @@ def lc_expiration_date(self):
108110
@property
109111
def b_sent_date(self):
110112
e = self.latest_event(type="sent_ballot_announcement")
111-
return e.time if e else None
113+
return e.time.date() if e else None
112114

113115
#b_discussion_date = models.DateField(null=True, blank=True) # unused
114116

@@ -142,7 +144,7 @@ def replaced_by(self):
142144
#replaces = FKAsOneToOne('replaces', reverse=True)
143145
@property
144146
def replaces(self):
145-
r = self.replaces_set()
147+
r = self.replaces_set
146148
return r[0] if r else None
147149

148150
@property
@@ -242,7 +244,12 @@ def rfc_flag(self):
242244
#ballot = models.ForeignKey(BallotInfo, related_name='drafts', db_column="ballot_id")
243245
@property
244246
def ballot(self):
245-
return self # FIXME: raise BallotInfo.DoesNotExist?
247+
if not self.idinternal:
248+
raise BallotInfo.DoesNotExist()
249+
return self
250+
@property
251+
def ballot_id(self):
252+
return self.ballot.name
246253

247254
#primary_flag = models.IntegerField(blank=True, null=True)
248255
@property
@@ -402,7 +409,7 @@ def document(self):
402409
return self
403410

404411
def comments(self):
405-
return self.event_set.all().order_by('-time')
412+
return DocumentComment.objects.filter(doc=self).order_by('-time')
406413

407414
def ballot_set(self):
408415
return [self]
@@ -579,22 +586,22 @@ def current_status(self):
579586
#updates = models.CharField(max_length=200,blank=True,null=True)
580587
@property
581588
def updates(self):
582-
return ",".join(sorted("RFC%s" % d.rfc_number for d in InternetDraft.objects.filter(docalias__relateddocument__document=self, docalias__relateddocument__relationship="updates")))
589+
return ",".join("RFC%s" % n for n in sorted(d.rfc_number for d in InternetDraft.objects.filter(docalias__relateddocument__document=self, docalias__relateddocument__relationship="updates")))
583590

584591
#updated_by = models.CharField(max_length=200,blank=True,null=True)
585592
@property
586593
def updated_by(self):
587-
return ",".join(sorted("RFC%s" % d.rfc_number for d in InternetDraft.objects.filter(relateddocument__doc_alias__document=self, relateddocument__relationship="updates")))
594+
return ",".join("RFC%s" % n for n in sorted(d.rfc_number for d in InternetDraft.objects.filter(relateddocument__doc_alias__document=self, relateddocument__relationship="updates")))
588595

589596
#obsoletes = models.CharField(max_length=200,blank=True,null=True)
590597
@property
591598
def obsoletes(self):
592-
return ",".join(sorted("RFC%s" % d.rfc_number for d in InternetDraft.objects.filter(docalias__relateddocument__document=self, docalias__relateddocument__relationship="obs")))
599+
return ",".join("RFC%s" % n for n in sorted(d.rfc_number for d in InternetDraft.objects.filter(docalias__relateddocument__document=self, docalias__relateddocument__relationship="obs")))
593600

594601
#obsoleted_by = models.CharField(max_length=200,blank=True,null=True)
595602
@property
596603
def obsoleted_by(self):
597-
return ",".join(sorted("RFC%s" % d.rfc_number for d in InternetDraft.objects.filter(relateddocument__doc_alias__document=self, relateddocument__relationship="obs")))
604+
return ",".join("RFC%s" % n for n in sorted(d.rfc_number for d in InternetDraft.objects.filter(relateddocument__doc_alias__document=self, relateddocument__relationship="obs")))
598605

599606
#also = models.CharField(max_length=50,blank=True,null=True)
600607
@property
@@ -655,3 +662,44 @@ def final_author_order(self):
655662
class Meta:
656663
proxy = True
657664

665+
class DocumentComment(Event):
666+
objects = TranslatingManager(dict(comment_text="desc",
667+
))
668+
669+
BALLOT_DISCUSS = 1
670+
BALLOT_COMMENT = 2
671+
BALLOT_CHOICES = (
672+
(BALLOT_DISCUSS, 'discuss'),
673+
(BALLOT_COMMENT, 'comment'),
674+
)
675+
#document = models.ForeignKey(IDInternal)
676+
@property
677+
def document(self):
678+
return self.doc
679+
#rfc_flag = models.IntegerField(null=True, blank=True)
680+
#public_flag = models.BooleanField() #unused
681+
#date = models.DateField(db_column='comment_date', default=datetime.date.today)
682+
@property
683+
def date(self):
684+
return self.time.date()
685+
#time = models.CharField(db_column='comment_time', max_length=20, default=lambda: datetime.datetime.now().strftime("%H:%M:%S"))
686+
#version = models.CharField(blank=True, max_length=3)
687+
#comment_text = models.TextField(blank=True)
688+
#created_by = BrokenForeignKey(IESGLogin, db_column='created_by', null=True, null_values=(0, 999))
689+
#result_state = BrokenForeignKey(IDState, db_column='result_state', null=True, related_name="comments_leading_to_state", null_values=(0, 99))
690+
#origin_state = models.ForeignKey(IDState, db_column='origin_state', null=True, related_name="comments_coming_from_state")
691+
#ballot = models.IntegerField(null=True, choices=BALLOT_CHOICES)
692+
def get_absolute_url(self):
693+
return "/idtracker/%d/comment/%d/" % (self.doc.name, self.id)
694+
def get_author(self):
695+
return unicode(self.by)
696+
def get_username(self):
697+
return unicode(self.by)
698+
def get_fullname(self):
699+
return unicode(self.by)
700+
def datetime(self):
701+
return self.time
702+
703+
class Meta:
704+
proxy = True
705+

0 commit comments

Comments
 (0)