From 083f60dd93867bf7e14990277078a49f19c93f19 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Sun, 29 Sep 2013 21:14:07 +0000 Subject: [PATCH] Renamed model .url() methods to .json_url() or .base_url(), depending on function. Replaced the use of custom django method request.get_host_protocol() with standard request.build_absolute_uri(). Removed an uncaught Http403 exception. Fixed a typo /venus_addr/venue_addr/. Removed relurl() methods; no longer needed. Removed some debug functions. - Legacy-Id: 6309 --- ietf/group/ajax.py | 4 +- ietf/group/models.py | 17 +-- ietf/meeting/ajax.py | 30 +++--- ietf/meeting/models.py | 109 +++++++++----------- ietf/meeting/views.py | 28 +---- ietf/person/models.py | 8 +- ietf/templates/meeting/agenda_list.html | 4 +- ietf/templates/meeting/properties_edit.html | 4 +- ietf/templates/meeting/timeslot_edit.html | 4 +- 9 files changed, 91 insertions(+), 117 deletions(-) diff --git a/ietf/group/ajax.py b/ietf/group/ajax.py index ca59d0f45..d4c0bd1cd 100644 --- a/ietf/group/ajax.py +++ b/ietf/group/ajax.py @@ -16,8 +16,8 @@ log = logging.getLogger(__name__) def group_json(request, groupname): group = get_object_or_404(Group, acronym=groupname) - #print "group request is: %s\n" % (request.get_host_protocol()) - return HttpResponse(json.dumps(group.json_dict(request.get_host_protocol()), + #print "group request is: %s\n" % (request.build_absolute_uri('/')) + return HttpResponse(json.dumps(group.json_dict(request.build_absolute_uri('/')), sort_keys=True, indent=2), mimetype="text/json") diff --git a/ietf/group/models.py b/ietf/group/models.py index c1e54d7b8..6468a41c6 100644 --- a/ietf/group/models.py +++ b/ietf/group/models.py @@ -1,5 +1,7 @@ # Copyright The IETF Trust 2007, All Rights Reserved +from urlparse import urljoin + from django.db import models from django.db.models import Q @@ -8,7 +10,8 @@ from ietf.person.models import Email, Person from ietf.group.colors import fg_group_colors, bg_group_colors import datetime - +import debug + class GroupInfo(models.Model): time = models.DateTimeField(default=datetime.datetime.now) name = models.CharField(max_length=80) @@ -88,20 +91,20 @@ class Group(GroupInfo): def bg_color(self): return bg_group_colors[self.upcase_acronym] - def url(self, sitefqdn): - return "%s/group/%s.json" % (sitefqdn, self.acronym) + def json_url(self): + return "/group/%s.json" % (self.acronym,) - def json_dict(self, sitefqdn): + def json_dict(self, host_scheme): group1= dict() - group1['href'] = self.url(sitefqdn) + group1['href'] = urljoin(host_scheme, self.json_url()) group1['acronym'] = self.acronym group1['name'] = self.name group1['state'] = self.state.slug group1['type'] = self.type.slug - group1['parent_href'] = self.parent.url(sitefqdn) + group1['parent_href'] = urljoin(host_scheme, self.parent.json_url()) # uncomment when people URL handle is created #if self.ad is not None: - # group1['ad_href'] = self.ad.url(sitefqdn) + # group1['ad_href'] = urljoin(host_scheme, self.ad.url()) group1['list_email'] = self.list_email group1['list_subscribe'] = self.list_subscribe group1['list_archive'] = self.list_archive diff --git a/ietf/meeting/ajax.py b/ietf/meeting/ajax.py index f7aa34973..12f0f41d8 100644 --- a/ietf/meeting/ajax.py +++ b/ietf/meeting/ajax.py @@ -1,3 +1,5 @@ +from urlparse import urljoin + from django.utils import simplejson as json from dajaxice.core import dajaxice_functions from dajaxice.decorators import dajaxice_register @@ -8,7 +10,7 @@ from django.shortcuts import get_object_or_404 from ietf.ietfauth.decorators import group_required, has_role from ietf.name.models import TimeSlotTypeName -from django.http import HttpResponseRedirect, HttpResponse, Http404, QueryDict, Http403 +from django.http import HttpResponseRedirect, HttpResponse, Http404, QueryDict from ietf.meeting.helpers import get_meeting, get_schedule, get_schedule_by_id, agenda_permissions from ietf.meeting.views import edit_timeslots, edit_agenda @@ -56,7 +58,7 @@ def readonly(request, meeting_num, schedule_id): return json.dumps( {'secretariat': secretariat, 'write_perm': write_perm, - 'owner_href': schedule.owner.url(request.get_host_protocol()), + 'owner_href': request.build_absolute_uri(schedule.owner.json_url()), 'read_only': read_only}) @group_required('Area Director','Secretariat') @@ -73,7 +75,7 @@ def update_timeslot(request, schedule_id, session_id, scheduledsession_id=None, cansee,canedit = agenda_permissions(meeting, schedule, request.user) if not canedit: - raise Http403 + #raise Exception("Not permitted") return json.dumps({'error':'no permission'}) session_id = int(session_id) @@ -136,7 +138,7 @@ def update_timeslot_purpose(request, timeslot_id=None, purpose=None): timeslot.type = timeslottypename timeslot.save() - return json.dumps(timeslot.json_dict(request.get_host_protocol)) + return json.dumps(timeslot.json_dict(request.build_absolute_uri('/'))) ############################################################################# ## ROOM API @@ -149,7 +151,7 @@ def timeslot_roomlist(request, mtg): rooms = mtg.room_set.all() json_array=[] for room in rooms: - json_array.append(room.json_dict(request.get_host_protocol)) + json_array.append(room.json_dict(request.build_absolute_uri('/'))) return HttpResponse(json.dumps(json_array), mimetype="application/json") @@ -199,7 +201,7 @@ def timeslot_roomurl(request, num=None, roomid=None): if request.method == 'GET': room = get_object_or_404(meeting.room_set, pk=roomid) - return HttpResponse(json.dumps(room.json_dict(request.get_host_protocol())), + return HttpResponse(json.dumps(room.json_dict(request.build_absolute_uri('/'))), mimetype="application/json") elif request.method == 'PUT': return timeslot_updroom(request, meeting) @@ -216,7 +218,7 @@ def timeslot_slotlist(request, mtg): slots = mtg.timeslot_set.all() json_array=[] for slot in slots: - json_array.append(slot.json_dict(request.get_host_protocol())) + json_array.append(slot.json_dict(request.build_absolute_uri('/'))) return HttpResponse(json.dumps(json_array), mimetype="application/json") @@ -267,7 +269,7 @@ def timeslot_sloturl(request, num=None, slotid=None): if request.method == 'GET': slot = get_object_or_404(meeting.timeslot_set, pk=slotid) - return HttpResponse(json.dumps(slot.json_dict(request.get_host_protocol())), + return HttpResponse(json.dumps(slot.json_dict(request.build_absolute_uri('/'))), mimetype="application/json") elif request.method == 'PUT': # not yet implemented! @@ -287,7 +289,7 @@ def agenda_list(request, mtg): agendas = mtg.schedule_set.all() json_array=[] for agenda in agendas: - json_array.append(agenda.json_dict(request.get_host_protocol)) + json_array.append(agenda.json_dict(request.build_absolute_uri('/'))) return HttpResponse(json.dumps(json_array), mimetype="application/json") @@ -355,7 +357,7 @@ def agenda_update(request, meeting, schedule): meeting.save() if "HTTP_ACCEPT" in request.META and "application/json" in request.META['HTTP_ACCEPT']: - return HttpResponse(json.dumps(schedule.json_dict(request.get_host_protocol())), + return HttpResponse(json.dumps(schedule.json_dict(request.build_absolute_uri('/'))), mimetype="application/json") else: return HttpResponseRedirect( @@ -390,7 +392,7 @@ def agenda_infourl(request, num=None, schedule_name=None): #log.debug("results in agenda: %u / %s" % (schedule.id, request.method)) if request.method == 'GET': - return HttpResponse(json.dumps(schedule.json_dict(request.get_host_protocol())), + return HttpResponse(json.dumps(schedule.json_dict(request.build_absolute_uri('/'))), mimetype="application/json") elif request.method == 'PUT': return agenda_update(request, meeting, schedule) @@ -404,7 +406,7 @@ def agenda_infourl(request, num=None, schedule_name=None): ############################################################################# def meeting_get(request, meeting): - return HttpResponse(json.dumps(meeting.json_dict(request.get_host_protocol()), + return HttpResponse(json.dumps(meeting.json_dict(request.build_absolute_uri('/')), sort_keys=True, indent=2), mimetype="application/json") @@ -458,7 +460,7 @@ def session_json(request, num, sessionid): except Session.DoesNotExist: return json.dumps({'error':"no such session %s" % sessionid}) - sess1 = session.json_dict(request.get_host_protocol()) + sess1 = session.json_dict(request.build_absolute_uri('/')) return HttpResponse(json.dumps(sess1, sort_keys=True, indent=2), mimetype="application/json") @@ -473,7 +475,7 @@ def session_constraints(request, num, sessionid): except Session.DoesNotExist: return json.dumps({"error":"no such session"}) - constraint_list = session.constraints_dict(request.get_host_protocol()) + constraint_list = session.constraints_dict(request.build_absolute_uri('/')) json_str = json.dumps(constraint_list, sort_keys=True, indent=2), diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index b2794a2ee..973e72917 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -1,6 +1,8 @@ # old meeting models can be found in ../proceedings/models.py import pytz, datetime +from urlparse import urljoin +import copy from django.db import models from django.conf import settings @@ -110,21 +112,20 @@ class Meeting(models.Model): return qs[0] return None - def url(self, sitefqdn, exten=".json"): - return "%s/meeting/%s%s" % (sitefqdn, self.number, exten) + def json_url(self): + return "/meeting/%s.json" % (self.number, ) - @property - def relurl(self): - return self.url("") + def base_url(self): + return "/meeting/%s" % (self.number, ) - def json_dict(self, sitefqdn): + def json_dict(self, host_scheme): # unfortunately, using the datetime aware json encoder seems impossible, # so the dates are formatted as strings here. agenda_url = "" if self.agenda: - agenda_url = self.agenda.url(sitefqdn) + agenda_url = urljoin(host_scheme, self.agenda.base_url()) return { - 'href': self.url(sitefqdn), + 'href': urljoin(host_scheme, self.base_url()), 'name': self.number, 'submission_start_date': fmt_date(self.get_submission_start_date()), 'submission_cut_off_date': fmt_date(self.get_submission_cut_off_date()), @@ -135,7 +136,7 @@ class Meeting(models.Model): 'country': self.country, 'time_zone': self.time_zone, 'venue_name': self.venue_name, - 'venus_addr': self.venue_addr, + 'venue_addr': self.venue_addr, 'break_area': self.break_area, 'reg_area': self.reg_area } @@ -205,16 +206,12 @@ class Room(models.Model): duration=ts.duration) self.meeting.create_all_timeslots() - def url(self, sitefqdn): - return "%s/meeting/%s/room/%s.json" % (sitefqdn, self.meeting.number, self.id) + def json_url(self): + return "/meeting/%s/room/%s.json" % (self.meeting.number, self.id) - @property - def relurl(self): - return self.url("") - - def json_dict(self, sitefqdn): + def json_dict(self, host_scheme): return { - 'href': self.url(sitefqdn), + 'href': urljoin(host_scheme, self.json_url()), 'name': self.name, 'capacity': self.capacity, } @@ -363,12 +360,8 @@ class TimeSlot(models.Model): ts["domid"] = self.js_identifier return ts - def url(self, sitefqdn): - return "%s/meeting/%s/timeslot/%s.json" % (sitefqdn, self.meeting.number, self.id) - - @property - def relurl(self): - return self.url("") + def json_url(self): + return "/meeting/%s/timeslot/%s.json" % (self.meeting.number, self.id) """ @@ -377,12 +370,14 @@ class TimeSlot(models.Model): rooms. """ def create_concurrent_timeslots(self): - ts = self - for room in self.meeting.room_set.all(): + rooms = self.meeting.room_set.all() + self.room = rooms[0] + self.save() + for room in rooms[1:]: + ts = copy.copy(self) + ts.id = None ts.location = room ts.save() - # this is simplest way to "clone" an object... - ts.id = None self.meeting.create_all_timeslots() """ @@ -438,19 +433,11 @@ class Schedule(models.Model): def __unicode__(self): return u"%s:%s(%s)" % (self.meeting, self.name, self.owner) - def url(self, sitefqdn): - return "%s/meeting/%s/agenda/%s" % (sitefqdn, self.meeting.number, self.name) + def base_url(self): + return "/meeting/%s/agenda/%s" % (self.meeting.number, self.name) - @property - def relurl(self): - return self.url("") - - def url_edit(self, sitefqdn): - return "%s/meeting/%s/agenda/%s/edit" % (sitefqdn, self.meeting.number, self.name) - - @property - def relurl_edit(self): - return self.url_edit("") + def url_edit(self): + return "/meeting/%s/agenda/%s/edit" % (self.meeting.number, self.name) @property def visible_token(self): @@ -489,14 +476,14 @@ class Schedule(models.Model): # I'm loath to put calls to reverse() in there. # is there a better way? - def url(self, sitefqdn): + def json_url(self): # XXX need to include owner. - return "%s/meeting/%s/agendas/%s.json" % (sitefqdn, self.meeting.number, self.name) + return "/meeting/%s/agendas/%s.json" % (self.meeting.number, self.name) - def json_dict(self, sitefqdn): + def json_dict(self, host_scheme): sch = dict() sch['schedule_id'] = self.id - sch['href'] = self.url(sitefqdn) + sch['href'] = urljoin(host_scheme, self.json_url()) if self.visible: sch['visible'] = "visible" else: @@ -505,7 +492,7 @@ class Schedule(models.Model): sch['public'] = "public" else: sch['public'] = "private" - sch['owner'] = self.owner.url(sitefqdn) + sch['owner'] = urljoin(host_scheme, self.owner.json_url()) # should include href to list of scheduledsessions, but they have no direct API yet. return sch @@ -631,7 +618,7 @@ class ScheduledSession(models.Model): def json_dict(self, selfurl): ss = dict() ss['scheduledsession_id'] = self.id - #ss['href'] = self.url(sitefqdn) + #ss['href'] = self.url(host_scheme) ss['empty'] = self.empty_str ss['timeslot_id'] = self.timeslot.id if self.session: @@ -664,21 +651,21 @@ class Constraint(models.Model): def __unicode__(self): return u"%s %s %s" % (self.source, self.name.name.lower(), self.target) - def url(self, sitefqdn): - return "%s/meeting/%s/constraint/%s.json" % (sitefqdn, self.meeting.number, self.id) + def json_url(self): + return "/meeting/%s/constraint/%s.json" % (self.meeting.number, self.id) - def json_dict(self, sitefqdn): + def json_dict(self, host_scheme): ct1 = dict() ct1['constraint_id'] = self.id - ct1['href'] = self.url(sitefqdn) + ct1['href'] = urljoin(host_scheme, self.json_url()) ct1['name'] = self.name.slug if self.person is not None: - ct1['person_href'] = self.person.url(sitefqdn) + ct1['person_href'] = urljoin(host_scheme, self.person.json_url()) if self.source is not None: - ct1['source_href'] = self.source.url(sitefqdn) + ct1['source_href'] = urljoin(host_scheme, self.source.json_url()) if self.target is not None: - ct1['target_href'] = self.target.url(sitefqdn) - ct1['meeting_href'] = self.meeting.url(sitefqdn) + ct1['target_href'] = urljoin(host_scheme, self.target.json_url()) + ct1['meeting_href'] = urljoin(host_scheme, self.meeting.json_url()) return ct1 @@ -763,24 +750,24 @@ class Session(models.Model): def official_scheduledsession(self): return self.scheduledsession_for_agenda(self.meeting.agenda) - def constraints_dict(self, sitefqdn): + def constraints_dict(self, host_scheme): constraint_list = [] for constraint in self.group.constraint_source_set.filter(meeting=self.meeting): - ct1 = constraint.json_dict(sitefqdn) + ct1 = constraint.json_dict(host_scheme) constraint_list.append(ct1) for constraint in self.group.constraint_target_set.filter(meeting=self.meeting): - ct1 = constraint.json_dict(sitefqdn) + ct1 = constraint.json_dict(host_scheme) constraint_list.append(ct1) return constraint_list - def url(self, sitefqdn): - return "%s/meeting/%s/session/%s.json" % (sitefqdn, self.meeting.number, self.id) + def json_url(self): + return "/meeting/%s/session/%s.json" % (self.meeting.number, self.id) - def json_dict(self, sitefqdn): + def json_dict(self, host_scheme): sess1 = dict() - sess1['href'] = self.url(sitefqdn) - sess1['group_href'] = self.group.url(sitefqdn) + sess1['href'] = urljoin(host_scheme, self.json_url()) + sess1['group_href'] = urljoin(host_scheme, self.group.json_url()) sess1['group_acronym'] = str(self.group.acronym) sess1['name'] = str(self.name) sess1['short_name'] = str(self.name) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index ed742b275..e5f46123b 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -46,8 +46,7 @@ from ietf.meeting.helpers import get_areas, get_area_list_from_sessions, get_pse from ietf.meeting.helpers import build_all_agenda_slices, get_wg_name_list from ietf.meeting.helpers import get_scheduledsessions_from_schedule, get_all_scheduledsessions_from_schedule from ietf.meeting.helpers import get_modified_from_scheduledsessions -from ietf.meeting.helpers import get_wg_list, session_draft_list -from ietf.meeting.helpers import get_meeting, get_schedule, read_agenda_file, agenda_permissions +from ietf.meeting.helpers import get_wg_list, get_meeting, get_schedule, agenda_permissions @decorator_from_middleware(GZipMiddleware) @@ -240,8 +239,8 @@ def edit_timeslots(request, num=None): time_slices,date_slices,slots = meeting.build_timeslices() - meeting_base_url = meeting.url(request.get_host_protocol(), "") - site_base_url =request.get_host_protocol() + meeting_base_url = request.build_absolute_uri(meeting.base_url()) + site_base_url =request.build_absolute_uri('/') rooms = meeting.room_set.order_by("capacity") rooms = rooms.all() @@ -289,8 +288,8 @@ def edit_agenda(request, num=None, schedule_name=None): schedule = get_schedule(meeting, schedule_name) #sys.stdout.write("2 requestor: %u for sched owned by: %u \n" % ( requestor.id, schedule.owner.id )) - meeting_base_url = meeting.url(request.get_host_protocol(), "") - site_base_url =request.get_host_protocol() + meeting_base_url = request.build_absolute_uri(meeting.base_url()) + site_base_url =request.build_absolute_uri('/') rooms = meeting.room_set.order_by("capacity") rooms = rooms.all() saveas = SaveAsForm() @@ -380,7 +379,6 @@ def edit_agendas(request, num=None, order=None): return HttpResponse(render_to_string("meeting/agenda_list.html", {"meeting": meeting, - "sitefqdn": request.get_host_protocol(), "schedules": schedules.all() }, RequestContext(request)), @@ -615,20 +613,6 @@ def session_draft_pdf(request, num, session): os.unlink(pdfn) return HttpResponse(pdf_contents, mimetype="application/pdf") -def get_meeting(num=None): - if (num == None): - meeting = Meeting.objects.filter(type="ietf").order_by("-date")[:1].get() - else: - meeting = get_object_or_404(Meeting, number=num) - return meeting - -def get_schedule(meeting, name=None): - if name is None: - schedule = meeting.agenda - else: - schedule = get_object_or_404(meeting.schedule_set, name=name) - return schedule - def week_view(request, num=None): meeting = get_meeting(num) timeslots = TimeSlot.objects.filter(meeting__id = meeting.id) @@ -681,9 +665,7 @@ def ical_agenda(request, num=None, schedule_name=None): tzfn = os.path.join(settings.TZDATA_ICS_PATH, meeting.time_zone + ".ics") tzf = open(tzfn) icstext = tzf.read() - debug.show('icstext[:128]') vtimezone = re.search("(?sm)(\nBEGIN:VTIMEZONE.*\nEND:VTIMEZONE\n)", icstext).group(1).strip() - debug.show('vtimezone[:128]') tzf.close() except IOError: vtimezone = None diff --git a/ietf/person/models.py b/ietf/person/models.py index 9651ced3b..eaffbe156 100644 --- a/ietf/person/models.py +++ b/ietf/person/models.py @@ -92,14 +92,14 @@ class Person(PersonInfo): def person(self): # little temporary wrapper to help porting to new schema return self - def url(self, sitefqdn): - return "%s/people/%s.json" % (sitefqdn, self.id) + def json_url(self): + return "/person/%s.json" % (self.id, ) # person json not yet implemented - #def json_dict(self, sitefqdn): + #def json_dict(self, host_scheme): # ct1 = dict() # ct1['person_id'] = self.id - # ct1['href'] = self.url(sitefqdn) + # ct1['href'] = self.url(host_scheme) # ct1['name'] = self.name # ct1['ascii'] = self.ascii # ct1['affliation']= self.affliation diff --git a/ietf/templates/meeting/agenda_list.html b/ietf/templates/meeting/agenda_list.html index 91a37ed55..789124847 100644 --- a/ietf/templates/meeting/agenda_list.html +++ b/ietf/templates/meeting/agenda_list.html @@ -36,7 +36,7 @@ < -
+

Meeting {{meeting.number}}

@@ -54,7 +54,7 @@ Public {% for agenda in schedules %} - + {{ agenda.official_token }} {{ agenda.owner }} diff --git a/ietf/templates/meeting/properties_edit.html b/ietf/templates/meeting/properties_edit.html index ab65edad4..4d94dba15 100644 --- a/ietf/templates/meeting/properties_edit.html +++ b/ietf/templates/meeting/properties_edit.html @@ -37,7 +37,7 @@ <
-
+

Meeting {{meeting.number}}

@@ -50,7 +50,7 @@
-
+
{{ form.as_table }} diff --git a/ietf/templates/meeting/timeslot_edit.html b/ietf/templates/meeting/timeslot_edit.html index fa1ebfcb9..cfe73196b 100644 --- a/ietf/templates/meeting/timeslot_edit.html +++ b/ietf/templates/meeting/timeslot_edit.html @@ -102,7 +102,7 @@ function setup_slots(){ {% for slot in slot_slices|lookup:day %}
X
@@ -120,7 +120,7 @@ function setup_slots(){
X
{{r}} ({{r.capacity}})