From 4506cb41e1ad5a9dfd1778263823f298f7ff390d Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Tue, 18 Nov 2008 21:36:14 +0000 Subject: [PATCH] Merged in Lars Eggert's changes to the search page, and Henrik's lefthand-menu addition - Legacy-Id: 1255 --- ietf/.gitignore | 2 - ietf/idtracker/.gitignore | 1 - ietf/idtracker/fixtures/.gitignore | 1 + ietf/idtracker/forms.py | 2 +- ietf/idtracker/models.py | 53 +- ietf/idtracker/templatetags/.gitignore | 1 - ietf/idtracker/templatetags/ietf_filters.py | 59 +++ ietf/idtracker/views.py | 24 +- ietf/proceedings/.gitignore | 1 - ietf/proceedings/feeds.py | 75 +++ ietf/proceedings/models.py | 20 + ietf/settings.py | 18 +- ietf/templates/.gitignore | 1 - ietf/templates/announcements/.gitignore | 1 - ietf/templates/announcements/send.html | 50 ++ .../templates/announcements/send_confirm.html | 13 + ietf/templates/base-new.html | 112 ----- ietf/templates/base.html | 89 ++-- ietf/templates/debug.html | 2 +- ietf/templates/feeds/.gitignore | 1 - .../templates/feeds/comments_description.html | 2 +- .../feeds/iesg-minutes_description.html | 2 +- .../feeds/wg-proceedings_description.html | 0 .../templates/feeds/wg-proceedings_title.html | 1 + ietf/templates/footer.html | 2 +- ietf/templates/idindex/.gitignore | 1 - ietf/templates/idindex/search.html | 27 ++ ietf/templates/idtracker/.gitignore | 1 - .../idtracker/ballotinfo_detail.html | 5 +- ietf/templates/idtracker/base.html | 37 -- .../idtracker/documentcomment_detail.html | 45 +- ietf/templates/idtracker/email_form.html | 3 +- ietf/templates/idtracker/email_sent.html | 3 +- .../idtracker/idinternal_detail.html | 456 ++++++++---------- .../idtracker/idinternal_notfound.html | 2 +- .../templates/idtracker/idtracker_search.html | 123 +++-- .../idtracker/idtracker_search_old.html | 55 --- .../idtracker/search_result_row.html | 52 +- .../idtracker/search_result_table.html | 47 +- ietf/templates/idtracker/state_desc.html | 9 +- ietf/templates/idtracker/states.html | 61 ++- ietf/templates/idtracker/status_of_items.html | 3 +- .../idtracker/view_evaluation_desc.html | 14 +- ietf/templates/idtracker/view_key.html | 14 +- ietf/templates/iesg/.gitignore | 1 - ietf/templates/ipr/.gitignore | 1 - ietf/templates/leftmenu.html | 73 +++ ietf/templates/liaisons/.gitignore | 1 - ietf/templates/mailinglists/.gitignore | 1 - ietf/templates/meeting/.gitignore | 1 + ietf/templates/my/.gitignore | 1 - ietf/templates/notify_expirations/body.txt | 6 + ietf/templates/notify_expirations/subject.txt | 1 + ietf/templates/registration/.gitignore | 1 + ietf/templates/utils/.gitignore | 1 + ietf/urls.py | 11 +- static/.gitignore | 1 + static/css/.gitignore | 1 + static/css/base.css | 220 +++++++-- static/images/.gitignore | 1 + static/images/header/.gitignore | 1 + static/images/nwg/.gitignore | 1 + static/media/.gitignore | 1 + static/media/css/.gitignore | 1 + static/media/img/.gitignore | 1 + static/media/img/admin/.gitignore | 1 + static/media/js/.gitignore | 1 + static/media/js/admin/.gitignore | 1 + 68 files changed, 1053 insertions(+), 768 deletions(-) create mode 100644 ietf/idtracker/fixtures/.gitignore create mode 100644 ietf/proceedings/feeds.py create mode 100644 ietf/templates/announcements/send.html create mode 100644 ietf/templates/announcements/send_confirm.html delete mode 100644 ietf/templates/base-new.html create mode 100644 ietf/templates/feeds/wg-proceedings_description.html create mode 100644 ietf/templates/feeds/wg-proceedings_title.html delete mode 100644 ietf/templates/idtracker/base.html delete mode 100644 ietf/templates/idtracker/idtracker_search_old.html create mode 100644 ietf/templates/leftmenu.html create mode 100644 ietf/templates/meeting/.gitignore create mode 100644 ietf/templates/notify_expirations/body.txt create mode 100644 ietf/templates/notify_expirations/subject.txt create mode 100644 ietf/templates/registration/.gitignore create mode 100644 ietf/templates/utils/.gitignore create mode 100644 static/.gitignore create mode 100644 static/css/.gitignore create mode 100644 static/images/.gitignore create mode 100644 static/images/header/.gitignore create mode 100644 static/images/nwg/.gitignore create mode 100644 static/media/.gitignore create mode 100644 static/media/css/.gitignore create mode 100644 static/media/img/.gitignore create mode 100644 static/media/img/admin/.gitignore create mode 100644 static/media/js/.gitignore create mode 100644 static/media/js/admin/.gitignore diff --git a/ietf/.gitignore b/ietf/.gitignore index 6811fdd3c3..a74b07aee4 100644 --- a/ietf/.gitignore +++ b/ietf/.gitignore @@ -1,3 +1 @@ -/*.swp /*.pyc -/settings_local.py diff --git a/ietf/idtracker/.gitignore b/ietf/idtracker/.gitignore index c7013ced9d..a74b07aee4 100644 --- a/ietf/idtracker/.gitignore +++ b/ietf/idtracker/.gitignore @@ -1,2 +1 @@ /*.pyc -/settings_local.py diff --git a/ietf/idtracker/fixtures/.gitignore b/ietf/idtracker/fixtures/.gitignore new file mode 100644 index 0000000000..a74b07aee4 --- /dev/null +++ b/ietf/idtracker/fixtures/.gitignore @@ -0,0 +1 @@ +/*.pyc diff --git a/ietf/idtracker/forms.py b/ietf/idtracker/forms.py index 07ea3fd226..ab306d9850 100644 --- a/ietf/idtracker/forms.py +++ b/ietf/idtracker/forms.py @@ -5,7 +5,7 @@ class IDSearch(forms.Form): search_job_owner = forms.ChoiceField(choices=(), required=False) - search_group_acronym = forms.CharField(widget=forms.TextInput(attrs={'size': 6, 'maxlength': 10}), required=False) + search_group_acronym = forms.CharField(widget=forms.TextInput(attrs={'size': 7, 'maxlength': 10}), required=False) search_status_id = forms.ModelChoiceField(IDStatus.objects.all(), empty_label="--All", required=False) search_area_acronym = forms.ModelChoiceField(Area.objects.filter(status=Area.ACTIVE), empty_label="--All/Any", required=False) search_cur_state = forms.ModelChoiceField(IDState.objects.all(), empty_label="--All/Any", required=False) diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py index dac3f4ff47..d7fdcc6a84 100644 --- a/ietf/idtracker/models.py +++ b/ietf/idtracker/models.py @@ -1,5 +1,6 @@ # Copyright The IETF Trust 2007, All Rights Reserved +from django.conf import settings from django.db import models from ietf.utils import FKAsOneToOne from django.test import TestCase @@ -117,6 +118,7 @@ class Admin: pass class InternetDraft(models.Model): + DAYS_TO_EXPIRE=185 id_document_tag = models.AutoField(primary_key=True) title = models.CharField(maxlength=255, db_column='id_document_name') id_document_key = models.CharField(maxlength=255, editable=False) @@ -153,9 +155,19 @@ def save(self): self.id_document_key = self.title.upper() super(InternetDraft, self).save() def displayname(self): - return "%s-%s.txt" % ( self.filename, self.revision_display() ) + if self.status.status == "Replaced": + css="replaced" + else: + css="active" + return '' + self.filename + '' + def displayname_with_link(self): + if self.status.status == "Replaced": + css="replaced" + else: + css="active" + return '%s' % ( self.doclink(), self.filename ) def doclink(self): - return "http://www.ietf.org/internet-drafts/%s" % ( self.displayname() ) + return "http://" + settings.TOOLS_SERVER + "/html/%s" % ( self.filename ) def group_acronym(self): return self.group.acronym def __str__(self): @@ -176,12 +188,26 @@ def doctype(self): def filename_with_link(self, text=None): if text is None: text=self.filename - if self.status.status != 'Active': - return text - else: - return '%s' % ( self.doclink(), text ) - def displayname_with_link(self): - return self.filename_with_link(self.displayname()) + return '%s' % ( self.doclink(), text ) + def expiration(self): + return self.revision_date + datetime.timedelta(self.DAYS_TO_EXPIRE) + def can_expire(self): + # Copying the logic from expire-ids-1 without thinking + # much about it. + if self.review_by_rfc_editor: + return False + idinternal = self.idinternal + if idinternal: + cur_state_id = idinternal.cur_state_id + # 42 is "AD is Watching"; this matches what's in the + # expire-ids-1 perl script. + # A better way might be to add a column to the table + # saying whether or not a document is prevented from + # expiring. + if cur_state_id < 42: + return False + return True + class Meta: db_table = "internet_drafts" class Admin: @@ -364,7 +390,7 @@ def revision(self): def revision_display(self): return "RFC" def doclink(self): - return "http://www.ietf.org/rfc/%s" % ( self.displayname() ) + return "http://" + settings.TOOLS_SERVER + "/html/%s" % ( self.displayname() ) def doctype(self): return "RFC" def filename_with_link(self): @@ -581,12 +607,17 @@ def get_author(self): if self.created_by_id and self.created_by_id != 999: return self.created_by.__str__() else: - return "system" + return "(System)" def get_username(self): if self.created_by_id and self.created_by_id != 999: return self.created_by.login_name else: - return "system" + return "(System)" + def get_fullname(self): + if self.created_by_id and self.created_by_id != 999: + return self.created_by.first_name + " " + self.created_by.last_name + else: + return "(System)" def datetime(self): # this is just a straightforward combination, except that the time is # stored incorrectly in the database. diff --git a/ietf/idtracker/templatetags/.gitignore b/ietf/idtracker/templatetags/.gitignore index c7013ced9d..a74b07aee4 100644 --- a/ietf/idtracker/templatetags/.gitignore +++ b/ietf/idtracker/templatetags/.gitignore @@ -1,2 +1 @@ /*.pyc -/settings_local.py diff --git a/ietf/idtracker/templatetags/ietf_filters.py b/ietf/idtracker/templatetags/ietf_filters.py index 907251f2f2..5f1608fe9a 100644 --- a/ietf/idtracker/templatetags/ietf_filters.py +++ b/ietf/idtracker/templatetags/ietf_filters.py @@ -169,6 +169,11 @@ def allononeline(text): """Simply removes CRs, LFs, leading and trailing whitespace from the given string.""" return text.replace("\r", "").replace("\n", "").strip() +@register.filter(name='allononelinew') +def allononelinew(text): + """Map runs of whitespace to a single space and strip leading and trailing whitespace from the given string.""" + return re.sub("[\r\n\t ]+", " ", text).strip() + @register.filter(name='rfcspace') def rfcspace(string): """ @@ -213,9 +218,63 @@ def inpast(date): return date < datetime.datetime.now() return True +@register.filter(name='truncatemore') +def truncatemore(text, arg): + """Truncate the text if longer than 'words', and if truncated, + add a link to the full text (given in 'link'). + """ + from django.utils.text import truncate_words + args = arg.split(",") + if len(args) == 3: + count, link, format = args + elif len(args) == 2: + format = "[more]" + count, link = args + else: + return text + try: + length = int(count) + except ValueError: # invalid literal for int() + return text # Fail silently. + if not isinstance(text, basestring): + text = str(text) + words = text.split() + if len(words) > length: + words = words[:length] + words.append(format % link) + return ' '.join(words) + +@register.filter(name="wrap_long_lines") +def wrap_long_lines(text): + """Wraps long lines without loosing the formatting and indentation + of short lines""" + if type(text) != type(""): + return text + text = re.sub(" *\r\n", "\n", text) # get rid of DOS line endings + text = re.sub(" *\r", "\n", text) # get rid of MAC line endings + text = re.sub("( *\n){3,}", "\n\n", text) # get rid of excessive vertical whitespace + lines = text.split("\n") + filled = [] + wrapped = False + for line in lines: + if wrapped and line.strip() != "": + line = filled[-1] + " " + line + filled = filled[:-1] + else: + wrapped = False + while (len(line) > 80) and (" " in line[:80]): + wrapped = True + breakpoint = line.rfind(" ",0,79) + filled += [ line[:breakpoint] ] + line = line[breakpoint+1:] + filled += [ line.rstrip() ] + return "\n".join(filled) + def _test(): import doctest doctest.testmod() if __name__ == "__main__": _test() + + \ No newline at end of file diff --git a/ietf/idtracker/views.py b/ietf/idtracker/views.py index 446ba1723e..6cee6e6dff 100644 --- a/ietf/idtracker/views.py +++ b/ietf/idtracker/views.py @@ -76,7 +76,24 @@ def search(request): if status != '': q_objs.append(Q(draft__status=status,rfc_flag=0)) matches = IDInternal.objects.all().filter(*q_objs) - matches = matches.order_by('cur_state', 'cur_sub_state', '-primary_flag') + matches = matches.order_by('cur_state', 'cur_sub_state', 'ballot_id', '-primary_flag') + # sort by date in reverse + # first build docstate groups, within which we sort + # in each docstate group, we build ballot id groups, which we sort + m1 = [] # list of: docstate, list of: event date; ballot id; list of: ms for the ballot id + for m in matches: + if m1 and m1[-1][0] == m.docstate(): + if m1[-1][1] and m1[-1][1][0][1] == m.ballot_id: + m1[-1][1][0][2].append(m) + else: + m1[-1][1].append((m.event_date, m.ballot_id, [m])) + else: + m1.append((m.docstate(), [(m.event_date, m.ballot_id, [m])])) + matches = [] + for ms in m1: ms[1].sort(reverse=True) + for ms in m1: + for mt in ms[1]: + matches.extend(mt[2]) # # Now search by I-D exists, if there could be any results. # If searching by job owner, current state or substate, there @@ -119,6 +136,7 @@ def search(request): 'form': form, 'matches': matches, 'searching': searching, + 'spacing': True }, context_instance=RequestContext(request)) # proof of concept, orphaned for now @@ -209,7 +227,7 @@ def view_id(request, queryset, slug, slug_field): except IDInternal.DoesNotExist: draft = get_object_or_404(InternetDraft, filename=slug) return render_to_response('idtracker/idinternal_notfound.html', {'draft': draft}, context_instance=RequestContext(request)) - return render_to_response('idtracker/idinternal_detail.html', {'object': object}, context_instance=RequestContext(request)) + return render_to_response('idtracker/idinternal_detail.html', {'object': object, 'spacing': False}, context_instance=RequestContext(request)) def view_rfc(request, object_id): '''A replacement for the object_detail generic view for this @@ -223,7 +241,7 @@ def view_rfc(request, object_id): This view gets the appropriate row from IDInternal and calls the template with the necessary context.''' object = get_object_or_404(IDInternal, pk=object_id, rfc_flag=1) - return render_to_response('idtracker/idinternal_detail.html', {'object': object}, context_instance=RequestContext(request)) + return render_to_response('idtracker/idinternal_detail.html', {'object': object, 'spacing': False}, context_instance=RequestContext(request)) # Wrappers around object_detail to give permalink a handle. # The named-URLs feature in django 0.97 will eliminate the diff --git a/ietf/proceedings/.gitignore b/ietf/proceedings/.gitignore index c7013ced9d..a74b07aee4 100644 --- a/ietf/proceedings/.gitignore +++ b/ietf/proceedings/.gitignore @@ -1,2 +1 @@ /*.pyc -/settings_local.py diff --git a/ietf/proceedings/feeds.py b/ietf/proceedings/feeds.py new file mode 100644 index 0000000000..7e6e8481e1 --- /dev/null +++ b/ietf/proceedings/feeds.py @@ -0,0 +1,75 @@ +import re +from django.contrib.syndication.feeds import Feed +from django.utils.feedgenerator import Atom1Feed +from ietf.proceedings.models import WgProceedingsActivities +from ietf.proceedings.models import Slide, WgAgenda, Proceeding +from datetime import datetime, time +from django.db import connection + +class LatestWgProceedingsActivity(Feed): + feed_type = Atom1Feed + link = "/foo" + description = "foobar" + language = "en" + feed_url = "/feed/ipr/" + base_url = "http://www3.ietf.org/proceedings/" + + def items(self): + objs = [] + for act in WgProceedingsActivities.objects.order_by('-act_date')[:60]: + obj = {} + + m = re.match("^slide, '(.*)', was uploaded$", act.activity) + if m: + obj['title'] = m.group(1) + obj['title'] = re.sub("[^ -~]+", "", obj['title']) + slides = Slide.objects.filter(meeting=act.meeting).filter(slide_name=m.group(1)).filter(group_acronym_id=act.group_acronym_id) + if len(slides) == 1: + obj['link'] = self.base_url + slides[0].file_loc() + + m = re.match("^agenda was uploaded$", act.activity) + if m: + obj['title'] = "agenda"; + agendas = WgAgenda.objects.filter(meeting=act.meeting).filter(group_acronym_id=act.group_acronym_id) + if len(agendas) == 1: + dir = Proceeding.objects.get(meeting_num=act.meeting).dir_name + obj['link'] = self.base_url + dir + "/agenda/" + agendas[0].filename + + if len(obj) > 0: + try: + act.irtf = False + obj['group_acronym'] = act.acronym() + except: + act.irtf = True + try: + obj['group_acronym'] = act.acronym() + except: + obj['group_acronym'] = "?" + obj['date'] = datetime.combine(act.act_date, time(int(act.act_time[0:2]), int(act.act_time[3:5]), int(act.act_time[6:8]))) + obj['author'] = str(act.act_by) + objs.append(obj) + + return objs + + def get_object(self, bits): + obj = {} + obj['title'] = "This is the title"; + return obj + + def title(self, obj): + return "Meeting Materials Activity" + + def item_link(self, item): + if 'link' in item: + return item['link'] + else: + return "" + + def item_pubdate(self, item): + return item['date'] + + def item_author_name(self, item): + return item['author'] + + def item_author_email(self, item): + return None; diff --git a/ietf/proceedings/models.py b/ietf/proceedings/models.py index d3d3fbb9f5..955d447eb4 100644 --- a/ietf/proceedings/models.py +++ b/ietf/proceedings/models.py @@ -469,3 +469,23 @@ class Meta: db_table = 'slides' class Admin: pass + +class WgProceedingsActivities(models.Model, ResolveAcronym): + id = models.AutoField(primary_key=True) + group_acronym_id = models.IntegerField(null=True, blank=True) + group_acronym = models.ForeignKey(Acronym, raw_id_admin=True) + + meeting = models.ForeignKey(Meeting, db_column='meeting_num') + activity = models.CharField(blank=True, maxlength=255) + act_date = models.DateField(null=True, blank=True) + act_time = models.CharField(blank=True, maxlength=100) + act_by = models.ForeignKey(PersonOrOrgInfo, db_column='act_by') + irtf = None + + def __str__(self): + #return "IETF%d: %s slides (%s)" % (self.meeting_id, self.acronym(), self.activity) + return "this is WgProceedingsActivities.__str__" + class Meta: + db_table = 'wg_proceedings_activities' + class Admin: + pass diff --git a/ietf/settings.py b/ietf/settings.py index 84040e6caf..2108dc41f1 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -5,7 +5,6 @@ # http://code.djangoproject.com/wiki/SplitSettings import os - import syslog syslog.openlog("django", syslog.LOG_PID, syslog.LOG_LOCAL0) @@ -15,16 +14,21 @@ DEBUG = True TEMPLATE_DEBUG = DEBUG +# Domain name of the IETF +IETF_DOMAIN = 'ietf.org' + ADMINS = ( - ('IETF Django Developers', 'django-project@ietf.org'), + ('IETF Django Developers', 'django-project@' + IETF_DOMAIN), ('GMail Tracker Archive', 'ietf.tracker.archive+errors@gmail.com'), ) -# Override this in the settings_local.py file: -SERVER_EMAIL = 'Django Server' +# Server name of the tools server +TOOLS_SERVER = 'tools.' + IETF_DOMAIN +# Override this in the settings_local.py file: +SERVER_EMAIL = 'Django Server ' -DEFAULT_FROM_EMAIL = 'IETF Secretariat ' +DEFAULT_FROM_EMAIL = 'IETF Secretariat ' MANAGERS = ADMINS @@ -33,7 +37,7 @@ DATABASE_USER = 'ietf' # Not used with sqlite3. #DATABASE_PASSWORD = 'playing' # Not used with sqlite3. DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. -#DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. +DATABASE_HOST = '130.129.48.40' # Set to empty string for localhost. Not used with sqlite3. # Local time zone for this installation. Choices can be found here: # http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE @@ -131,6 +135,8 @@ 'ietf.my', 'ietf.proceedings', 'ietf.redirects', +# not yet merged from the Vancouver branch +# 'ietf.wgcharter', ) INTERNAL_IPS = ( diff --git a/ietf/templates/.gitignore b/ietf/templates/.gitignore index c7013ced9d..a74b07aee4 100644 --- a/ietf/templates/.gitignore +++ b/ietf/templates/.gitignore @@ -1,2 +1 @@ /*.pyc -/settings_local.py diff --git a/ietf/templates/announcements/.gitignore b/ietf/templates/announcements/.gitignore index c7013ced9d..a74b07aee4 100644 --- a/ietf/templates/announcements/.gitignore +++ b/ietf/templates/announcements/.gitignore @@ -1,2 +1 @@ /*.pyc -/settings_local.py diff --git a/ietf/templates/announcements/send.html b/ietf/templates/announcements/send.html new file mode 100644 index 0000000000..ba37271703 --- /dev/null +++ b/ietf/templates/announcements/send.html @@ -0,0 +1,50 @@ +{# Copyright The IETF Trust 2007, All Rights Reserved #} + +{% extends "base.html" %} + +{% block title %}IETF Announcement{% endblock %} + +{% block head %} + +{% endblock %} + +{% block content %} +
+
+ {% if form.is_valid %}{% ifequal request.POST.op "Preview" %} +
+From: {{ form.clean_data.sender }}
+To: {{ form.clean_data.recipient }}{% if form.clean_data.cc %}
+Cc: {{ form.clean_data.cc }}{% endif %}{% if form.clean_data.bcc %}
+Bcc: {{ form.clean_data.bcc }}{% endif %}{% if form.clean_data.reply_to %}
+Reply-to: {{ form.clean_data.reply_to }}{% endif %}
+
+{{ form.clean_data.body }}
+        
+ + {% endifequal %}{% endif %} + + {% for field in form %} +
+ {{ field.label_tag }} + + {# Ideally this would go in the tag #} + {% if field.field.required %} + * + {% endif %} + + {{ field }} + + {% if field.help_text %} +
+ {{ field.help_text }} +
+ {% endif %} + + {% if field.errors %}{{field.errors }}{% endif %} +
+ {% endfor %} + +
+
+{% endblock %} diff --git a/ietf/templates/announcements/send_confirm.html b/ietf/templates/announcements/send_confirm.html new file mode 100644 index 0000000000..ac08fcd314 --- /dev/null +++ b/ietf/templates/announcements/send_confirm.html @@ -0,0 +1,13 @@ +{# Copyright The IETF Trust 2007, All Rights Reserved #} + +{% extends "base.html" %} + +{% block title %}IETF Announcement{% endblock %} + +{% block head %} + +{% endblock %} + +{% block content %} +

Announcement sent.

+{% endblock %} diff --git a/ietf/templates/base-new.html b/ietf/templates/base-new.html deleted file mode 100644 index a3df139430..0000000000 --- a/ietf/templates/base-new.html +++ /dev/null @@ -1,112 +0,0 @@ -{# Copyright The IETF Trust 2007, All Rights Reserved #} - - - - - - -{% block title %}IETF Data{% endblock %} - WCF - - - - - - -
- {% block content %}{% endblock %} - {% block main_content %}{% endblock %} -{% if debug %} -
-

Queries

-

- {{ sql_queries|length }} Queries - {% ifnotequal sql_queries|length 0 %} - (Show) - {% endifnotequal %} -

- - - - - - - - - - - - - {% for query in sql_queries %} - - - - {% endfor %} - - -
-{% endif %} -
- - - - - - diff --git a/ietf/templates/base.html b/ietf/templates/base.html index 1fbc569e8a..00d8cac062 100644 --- a/ietf/templates/base.html +++ b/ietf/templates/base.html @@ -1,56 +1,43 @@ {% block doctype %} - + {% endblock %} + + {# Copyright The IETF Trust 2007, All Rights Reserved #} - - - - {% block title %}IETF Data{% endblock %}{% ifnotequal server_mode "production" %} - {{ server_mode|upper }} MODE{% endifnotequal %} - {% ifnotequal server_mode "production" %} - - {% else %} - - {% endifnotequal %} - {% block head %}{% endblock %} - - - -
- - - - - - - - - - - - - - - -
-
- {% if user.is_authenticated %} - Logged in as {{ user }} - | - Log Out - {% endif %} -
- -
- {% block content %}{% endblock %} - {% block main_content %}{% endblock %} -
- {% block footer %}{% include "footer.html" %}{% endblock %} - {% include "debug.html" %} - + + + + + {% block title %}IETF Data{% endblock %}{% ifnotequal server_mode "production" %} - {{ server_mode|upper }} MODE{% endifnotequal %} + + {% ifnotequal server_mode "production" %} + + {% else %} + + {% endifnotequal %} + + {% block head %}{% endblock %} + + + + +
+ {% include "leftmenu.html" %} +
+ + +
+ {% if user.is_authenticated %} + Logged in as {{ user }} | + Log Out + {% endif %} + {% block content %}{% endblock %} +
+ {% block footer %}{% include "footer.html" %}{% endblock %} + {% include "debug.html" %} + diff --git a/ietf/templates/debug.html b/ietf/templates/debug.html index d0333923f9..17999c801f 100644 --- a/ietf/templates/debug.html +++ b/ietf/templates/debug.html @@ -1,7 +1,7 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} {% if debug %} {% load ietf_filters %} -
+

Queries

{{ sql_queries|length }} Queries ({{ sql_queries|timesum }}s) diff --git a/ietf/templates/feeds/.gitignore b/ietf/templates/feeds/.gitignore index c7013ced9d..a74b07aee4 100644 --- a/ietf/templates/feeds/.gitignore +++ b/ietf/templates/feeds/.gitignore @@ -1,2 +1 @@ /*.pyc -/settings_local.py diff --git a/ietf/templates/feeds/comments_description.html b/ietf/templates/feeds/comments_description.html index 9fc939e5ca..efa11ef7ba 100644 --- a/ietf/templates/feeds/comments_description.html +++ b/ietf/templates/feeds/comments_description.html @@ -1,3 +1,3 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} {% load ietf_filters %} -{{ obj.comment_text|format_textarea|truncatewords_html:"40" }} +{{ obj.comment_text|format_textarea|truncatewords_html:"20" }} diff --git a/ietf/templates/feeds/iesg-minutes_description.html b/ietf/templates/feeds/iesg-minutes_description.html index 4d2def854d..3a76b225c6 100644 --- a/ietf/templates/feeds/iesg-minutes_description.html +++ b/ietf/templates/feeds/iesg-minutes_description.html @@ -1,3 +1,3 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} {% load ietf_filters %} -{{ obj.telechat_minute|escape|linebreaks|truncatewords_html:"40" }} +{{ obj.telechat_minute|escape|linebreaks|truncatewords_html:"20" }} diff --git a/ietf/templates/feeds/wg-proceedings_description.html b/ietf/templates/feeds/wg-proceedings_description.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ietf/templates/feeds/wg-proceedings_title.html b/ietf/templates/feeds/wg-proceedings_title.html new file mode 100644 index 0000000000..73e14b9279 --- /dev/null +++ b/ietf/templates/feeds/wg-proceedings_title.html @@ -0,0 +1 @@ +{{ obj.group_acronym }}: {{ obj.title|escape }} diff --git a/ietf/templates/footer.html b/ietf/templates/footer.html index 1951cfd9de..d39c17ea5f 100644 --- a/ietf/templates/footer.html +++ b/ietf/templates/footer.html @@ -1,6 +1,6 @@ {# Copyright The IETF Trust 2007, All Rights Reserved #} +