Skip to content

Commit 8764a1d

Browse files
committed
Port idtracker/views.py, fixing some bugs in the proxy classes
- Legacy-Id: 3116
1 parent 5422874 commit 8764a1d

5 files changed

Lines changed: 83 additions & 43 deletions

File tree

ietf/idtracker/views.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
# Create your views here.
44
from django.http import HttpResponsePermanentRedirect, Http404
5+
from django.conf import settings
56
from django.template import RequestContext
67
from django.shortcuts import get_object_or_404, render_to_response
78
from django.views.generic.list_detail import object_detail, object_list
89
from ietf.idtracker.models import InternetDraft, IDInternal, IDState, IDSubState, BallotInfo, DocumentComment
9-
import re
10+
import re, datetime
1011

1112
def state_desc(request, state, is_substate=0):
1213
if int(state) == 100:
@@ -27,15 +28,30 @@ def state_desc(request, state, is_substate=0):
2728
context_instance=RequestContext(request))
2829

2930
def status(request):
31+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
32+
drafts = list(IDInternal.objects.exclude(iesg_state=None).exclude(iesg_state__in=('pub', 'dead', 'watching', 'rfcqueue')).order_by('iesg_state__order'))
33+
drafts.sort(key=lambda d: (d.cur_state_id, d.status_date or datetime.date.min, d.b_sent_date or datetime.date.min))
34+
# sadly we can't use the generic view because it only works with a queryset...
35+
return render_to_response('idtracker/status_of_items.html', dict(object_list=drafts, title="IESG Status of Items"), context_instance=RequestContext(request))
36+
3037
queryset = IDInternal.objects.filter(primary_flag=1).exclude(cur_state__state__in=('RFC Ed Queue', 'RFC Published', 'AD is watching', 'Dead')).order_by('cur_state', 'status_date', 'ballot')
3138
return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'IESG Status of Items'})
3239

3340
def last_call(request):
41+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
42+
drafts = list(IDInternal.objects.exclude(iesg_state=None).filter(iesg_state__in=('lc', 'writeupw', 'goaheadw')).order_by('iesg_state__order'))
43+
drafts.sort(key=lambda d: (d.cur_state_id, d.status_date or datetime.date.min, d.b_sent_date or datetime.date.min))
44+
# sadly we can't use the generic view because it only works with a queryset...
45+
return render_to_response('idtracker/status_of_items.html', dict(object_list=drafts, title="Documents in Last Call", lastcall=1), context_instance=RequestContext(request))
46+
3447
queryset = IDInternal.objects.filter(primary_flag=1).filter(cur_state__state__in=('In Last Call', 'Waiting for Writeup', 'Waiting for AD Go-Ahead')).order_by('cur_state', 'status_date', 'ballot')
3548
return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'Documents in Last Call', 'lastcall': 1})
3649

3750
def redirect_id(request, object_id):
3851
'''Redirect from historical document ID to preferred filename url.'''
52+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
53+
raise Http404() # we don't store the numbers anymore
54+
3955
doc = get_object_or_404(InternetDraft, id_document_tag=object_id)
4056
return HttpResponsePermanentRedirect("/doc/"+doc.filename+"/")
4157

@@ -46,6 +62,9 @@ def redirect_filename(request, filename):
4662
return HttpResponsePermanentRedirect("/doc/"+filename+"/")
4763

4864
def redirect_ballot(request, object_id):
65+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
66+
raise Http404() # we don't store the numbers anymore
67+
4968
ballot = get_object_or_404(BallotInfo, pk=object_id)
5069
ids = ballot.drafts.filter(primary_flag=1)
5170
if len(ids) == 0:
@@ -57,6 +76,9 @@ def redirect_ballot(request, object_id):
5776
return HttpResponsePermanentRedirect("/doc/"+id.draft.filename+"/#ballot")
5877

5978
def redirect_comment(request, object_id):
79+
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
80+
raise Http404() # we don't store the numbers anymore
81+
6082
comment = get_object_or_404(DocumentComment, pk=object_id)
6183
id = comment.document
6284
if id.rfc_flag:

redesign/doc/proxy.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class InternetDraft(Document):
1313
status=lambda v: ("state", { 1: 'active', 2: 'expired', 3: 'rfc', 4: 'auth-rm', 5: 'repl', 6: 'ietf-rm'}[v]),
1414
job_owner="ad",
1515
rfc_number=lambda v: ("docalias__name", "rfc%s" % v),
16+
cur_state="iesg_state__order",
1617
))
1718

1819
DAYS_TO_EXPIRE=185
@@ -324,7 +325,7 @@ def agenda(self):
324325
#cur_state = models.ForeignKey(IDState, db_column='cur_state', related_name='docs')
325326
@property
326327
def cur_state(self):
327-
return IDState().from_old_object(self.iesg_state)
328+
return IDState().from_object(self.iesg_state) if self.iesg_state else None
328329

329330
@property
330331
def cur_state_id(self):
@@ -334,7 +335,7 @@ def cur_state_id(self):
334335
@property
335336
def prev_state(self):
336337
ds = self.dochistory_set.exclude(iesg_state=self.iesg_state).order_by('-time')[:1]
337-
return IDState().from_old_object(ds[0].iesg_state) if ds else None
338+
return IDState().from_object(ds[0].iesg_state) if ds else None
338339

339340
#assigned_to = models.CharField(blank=True, max_length=25) # unused
340341

@@ -360,19 +361,25 @@ def event_date(self):
360361
#area_acronym = models.ForeignKey(Area)
361362
@property
362363
def area_acronym(self):
363-
if self.group:
364-
return self.group.parent
364+
from group.proxy import Area
365+
g = super(self.__class__, self).group # be careful with group which is proxied
366+
if g and g.type_id != "individ":
367+
return Area().from_object(g.parent)
365368
elif self.ad:
366369
# return area for AD
367-
return ad.role_set.get(type="ad", group__state="active").group
370+
try:
371+
area = Group.objects.get(role__name="ad", role__email=self.ad, state="active")
372+
return Area().from_object(area)
373+
except Group.DoesNotExist:
374+
return None
368375
else:
369376
return None
370377

371378
#cur_sub_state = BrokenForeignKey(IDSubState, related_name='docs', null=True, blank=True, null_values=(0, -1))
372379
@property
373380
def cur_sub_state(self):
374381
s = self.tags.filter(slug__in=['extpty', 'need-rev', 'ad-f-up', 'point'])
375-
return IDSubState().from_old_object(s[0]) if s else None
382+
return IDSubState().from_object(s[0]) if s else None
376383
@property
377384
def cur_sub_state_id(self):
378385
s = self.cur_sub_state
@@ -383,7 +390,7 @@ def cur_sub_state_id(self):
383390
def prev_sub_state(self):
384391
ds = self.dochistory_set.all().order_by('-time')[:1]
385392
substates = ds[0].tags.filter(slug__in=['extpty', 'need-rev', 'ad-f-up', 'point']) if ds else None
386-
return IDSubState().from_old_object(substates[0]) if substates else None
393+
return IDSubState().from_object(substates[0]) if substates else None
387394
@property
388395
def prev_sub_state_id(self):
389396
s = self.prev_sub_state
@@ -546,7 +553,7 @@ def active_positions(self):
546553
res = []
547554
def add(ad, pos):
548555
from person.proxy import IESGLogin as IESGLoginProxy
549-
res.append(dict(ad=IESGLoginProxy(ad), pos=Position().from_old_object(pos) if pos else None))
556+
res.append(dict(ad=IESGLoginProxy(ad), pos=Position().from_object(pos) if pos else None))
550557

551558
found = set()
552559
for pos in BallotPositionEvent.objects.filter(doc=self, type="changed_ballot_position", ad__in=active_ads).select_related('ad').order_by("-time", "-id"):
@@ -755,7 +762,7 @@ class Meta:
755762

756763

757764
class Position(BallotPositionEvent):
758-
def from_old_object(self, base):
765+
def from_object(self, base):
759766
for f in base._meta.fields:
760767
if not f.name in ('discuss',): # don't overwrite properties
761768
setattr(self, f.name, getattr(base, f.name))
@@ -816,7 +823,9 @@ class IDState(IesgDocStateName):
816823
DEAD = 99
817824
DO_NOT_PUBLISH_STATES = (33, 34)
818825

819-
def from_old_object(self, base):
826+
objects = TranslatingManager(dict(pk="order"))
827+
828+
def from_object(self, base):
820829
for f in base._meta.fields:
821830
setattr(self, f.name, getattr(base, f.name))
822831
return self
@@ -859,14 +868,17 @@ class Meta:
859868
proxy = True
860869

861870

862-
class IDSubStateManager(models.Manager):
871+
class IDSubStateManager(TranslatingManager):
872+
def __init__(self, *args):
873+
super(IDSubStateManager, self).__init__(*args)
874+
863875
def all(self):
864876
return self.filter(slug__in=['extpty', 'need-rev', 'ad-f-up', 'point'])
865877

866878
class IDSubState(DocInfoTagName):
867-
objects = IDSubStateManager()
879+
objects = IDSubStateManager(dict(pk="order"))
868880

869-
def from_old_object(self, base):
881+
def from_object(self, base):
870882
for f in base._meta.fields:
871883
setattr(self, f.name, getattr(base, f.name))
872884
return self

redesign/group/proxy.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ def __get__(self, obj, type=None):
77

88
INDIVIDUAL_SUBMITTER = LazyIndividualSubmitter()
99

10-
def __init__(self, base):
10+
def from_object(self, base):
1111
for f in base._meta.fields:
1212
setattr(self, f.name, getattr(base, f.name))
13+
return self
1314

1415
#acronym_id = models.AutoField(primary_key=True)
1516
@property
@@ -32,11 +33,16 @@ class Meta:
3233
proxy = True
3334

3435
class Area(Group):
36+
def from_object(self, base):
37+
for f in base._meta.fields:
38+
setattr(self, f.name, getattr(base, f.name))
39+
return self
40+
3541
ACTIVE=1
3642
#area_acronym = models.OneToOneField(Acronym, primary_key=True)
3743
@property
3844
def area_acronym(self):
39-
return Acronym(self)
45+
return Acronym().from_object(self)
4046

4147
#start_date = models.DateField(auto_now_add=True)
4248
#concluded_date = models.DateField(null=True, blank=True)
@@ -63,7 +69,7 @@ class IETFWG(Group):
6369
#group_acronym = models.OneToOneField(Acronym, primary_key=True, editable=False)
6470
@property
6571
def group_acronym(self):
66-
return Acronym(self)
72+
return Acronym().from_object(self)
6773

6874
#group_type = models.ForeignKey(WGType)
6975
#proposed_date = models.DateField(null=True, blank=True)

redesign/importing/import-document-state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ def import_from_idinternal(d, idinternal):
755755
#all_drafts = all_drafts.none()
756756

757757
for index, o in enumerate(all_drafts.iterator()):
758-
print "importing", o.id_document_tag, o.filename, index
758+
print "importing", o.id_document_tag, o.filename, index, "ballot %s" % o.idinternal.ballot_id if o.idinternal and o.idinternal.ballot_id else ""
759759

760760
try:
761761
d = Document.objects.get(name=o.filename)

redesign/proxy_utils.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,108 +40,108 @@ def translated_kwargs(self, kwargs):
4040

4141
# overridden methods
4242
def _clone(self, *args, **kwargs):
43-
c = super(self.__class__, self)._clone(*args, **kwargs)
43+
c = super(TranslatingQuerySet, self)._clone(*args, **kwargs)
4444
c.translated_attrs = self.translated_attrs
4545
return c
4646

4747
def dates(self, *args, **kwargs):
4848
kwargs = self.translated_kwargs(kwargs)
49-
return super(self.__class__, self).dates(*args, **kwargs)
49+
return super(TranslatingQuerySet, self).dates(*args, **kwargs)
5050

5151
def distinct(self, *args, **kwargs):
5252
kwargs = self.translated_kwargs(kwargs)
53-
return super(self.__class__, self).distinct(*args, **kwargs)
53+
return super(TranslatingQuerySet, self).distinct(*args, **kwargs)
5454

5555
def extra(self, *args, **kwargs):
5656
kwargs = self.translated_kwargs(kwargs)
57-
return super(self.__class__, self).extra(*args, **kwargs)
57+
return super(TranslatingQuerySet, self).extra(*args, **kwargs)
5858

5959
def get(self, *args, **kwargs):
6060
kwargs = self.translated_kwargs(kwargs)
61-
return super(self.__class__, self).get(*args, **kwargs)
61+
return super(TranslatingQuerySet, self).get(*args, **kwargs)
6262

6363
def get_or_create(self, **kwargs):
6464
kwargs = self.translated_kwargs(kwargs)
65-
return super(self.__class__, self).get_or_create(**kwargs)
65+
return super(TranslatingQuerySet, self).get_or_create(**kwargs)
6666

6767
def create(self, **kwargs):
6868
kwargs = self.translated_kwargs(kwargs)
69-
return super(self.__class__, self).create(**kwargs)
69+
return super(TranslatingQuerySet, self).create(**kwargs)
7070

7171
def filter(self, *args, **kwargs):
7272
kwargs = self.translated_kwargs(kwargs)
73-
return super(self.__class__, self).filter(*args, **kwargs)
73+
return super(TranslatingQuerySet, self).filter(*args, **kwargs)
7474

7575
def aggregate(self, *args, **kwargs):
7676
kwargs = self.translated_kwargs(kwargs)
77-
return super(self.__class__, self).aggregate(*args, **kwargs)
77+
return super(TranslatingQuerySet, self).aggregate(*args, **kwargs)
7878

7979
def annotate(self, *args, **kwargs):
8080
kwargs = self.translated_kwargs(kwargs)
81-
return super(self.__class__, self).annotate(*args, **kwargs)
81+
return super(TranslatingQuerySet, self).annotate(*args, **kwargs)
8282

8383
def complex_filter(self, *args, **kwargs):
8484
kwargs = self.translated_kwargs(kwargs)
85-
return super(self.__class__, self).complex_filter(*args, **kwargs)
85+
return super(TranslatingQuerySet, self).complex_filter(*args, **kwargs)
8686

8787
def exclude(self, *args, **kwargs):
8888
kwargs = self.translated_kwargs(kwargs)
89-
return super(self.__class__, self).exclude(*args, **kwargs)
89+
return super(TranslatingQuerySet, self).exclude(*args, **kwargs)
9090

9191
def in_bulk(self, *args, **kwargs):
9292
kwargs = self.translated_kwargs(kwargs)
93-
return super(self.__class__, self).in_bulk(*args, **kwargs)
93+
return super(TranslatingQuerySet, self).in_bulk(*args, **kwargs)
9494

9595
def iterator(self, *args, **kwargs):
9696
kwargs = self.translated_kwargs(kwargs)
97-
return super(self.__class__, self).iterator(*args, **kwargs)
97+
return super(TranslatingQuerySet, self).iterator(*args, **kwargs)
9898

9999
def latest(self, *args, **kwargs):
100100
kwargs = self.translated_kwargs(kwargs)
101-
return super(self.__class__, self).latest(*args, **kwargs)
101+
return super(TranslatingQuerySet, self).latest(*args, **kwargs)
102102

103103
def order_by(self, *args, **kwargs):
104104
args = self.translated_args(args)
105105
kwargs = self.translated_kwargs(kwargs)
106-
return super(self.__class__, self).order_by(*args, **kwargs)
106+
return super(TranslatingQuerySet, self).order_by(*args, **kwargs)
107107

108108
def select_related(self, *args, **kwargs):
109109
kwargs = self.translated_kwargs(kwargs)
110-
return super(self.__class__, self).select_related(*args, **kwargs)
110+
return super(TranslatingQuerySet, self).select_related(*args, **kwargs)
111111

112112
def values(self, *args, **kwargs):
113113
args = self.translated_args(args)
114114
kwargs = self.translated_kwargs(kwargs)
115-
return super(self.__class__, self).values(*args, **kwargs)
115+
return super(TranslatingQuerySet, self).values(*args, **kwargs)
116116

117117
def values_list(self, *args, **kwargs):
118118
args = self.translated_args(args)
119119
kwargs = self.translated_kwargs(kwargs)
120-
return super(self.__class__, self).values_list(*args, **kwargs)
120+
return super(TranslatingQuerySet, self).values_list(*args, **kwargs)
121121

122122
def update(self, *args, **kwargs):
123123
kwargs = self.translated_kwargs(kwargs)
124-
return super(self.__class__, self).update(*args, **kwargs)
124+
return super(TranslatingQuerySet, self).update(*args, **kwargs)
125125

126126
def reverse(self, *args, **kwargs):
127127
kwargs = self.translated_kwargs(kwargs)
128-
return super(self.__class__, self).reverse(*args, **kwargs)
128+
return super(TranslatingQuerySet, self).reverse(*args, **kwargs)
129129

130130
def defer(self, *args, **kwargs):
131131
kwargs = self.translated_kwargs(kwargs)
132-
return super(self.__class__, self).defer(*args, **kwargs)
132+
return super(TranslatingQuerySet, self).defer(*args, **kwargs)
133133

134134
def only(self, *args, **kwargs):
135135
kwargs = self.translated_kwargs(kwargs)
136-
return super(self.__class__, self).only(*args, **kwargs)
136+
return super(TranslatingQuerySet, self).only(*args, **kwargs)
137137

138138
def _insert(self, values, **kwargs):
139139
kwargs = self.translated_kwargs(kwargs)
140140
return insert_query(self.model, values, **kwargs)
141141

142142
def _update(self, values, **kwargs):
143143
kwargs = self.translated_kwargs(kwargs)
144-
return super(self.__class__, self)._update(values, **kwargs)
144+
return super(TranslatingQuerySet, self)._update(values, **kwargs)
145145

146146
class TranslatingManager(Manager):
147147
"""Translates keyword arguments for the ORM, for use in proxy
@@ -151,7 +151,7 @@ class TranslatingManager(Manager):
151151
with the right-hand side to transform it."""
152152

153153
def __init__(self, trans):
154-
super(self.__class__, self).__init__()
154+
super(TranslatingManager, self).__init__()
155155
self.translated_attrs = trans
156156

157157
def get_query_set(self):

0 commit comments

Comments
 (0)