EventAggregator

actions/EventAggregatorNewEvent.py

71:70ecc981f853
2010-02-01 Paul Boddie Updated release notes.
     1 # -*- coding: iso-8859-1 -*-     2 """     3     MoinMoin - EventAggregatorNewEvent Action     4      5     @copyright: 2008, 2009, 2010 by Paul Boddie <paul@boddie.org.uk>     6     @copyright: 2000-2004 Juergen Hermann <jh@web.de>,     7                 2003-2008 MoinMoin:ThomasWaldmann,     8                 2004-2006 MoinMoin:AlexanderSchremmer,     9                 2007 MoinMoin:ReimarBauer.    10     @license: GNU GPL (v2 or later), see COPYING.txt for details.    11 """    12     13 from MoinMoin.action import ActionBase    14 from MoinMoin.Page import Page    15 from MoinMoin.PageEditor import PageEditor    16 import EventAggregatorSupport    17 import calendar    18 import re    19     20 Dependencies = ['pages']    21     22 # Action class and supporting functions.    23     24 class EventAggregatorNewEvent(ActionBase):    25     26     "An event creation dialogue requesting various parameters."    27     28     def _get_selected(self, value, input_value):    29         return input_value is not None and value == input_value and 'selected="selected"' or ''    30     31     def _get_selected_for_list(self, value, input_values):    32         return value in input_values and 'selected="selected"' or ''    33     34     def _get_input(self, form, name, default):    35         return int(form.get(name, [None])[0] or default)    36     37     def get_form_html(self, buttons_html):    38         _ = self._    39         request = self.request    40         form = request.form    41     42         category_list = []    43         category_pagenames = form.get("category", [])    44     45         for category_name, category_pagename in \    46             EventAggregatorSupport.getCategoryMapping(    47                 EventAggregatorSupport.getCategories(request),    48                 request):    49     50             selected = self._get_selected_for_list(category_pagename, category_pagenames)    51             category_list.append('<option value="%s" %s>%s</option>' % (category_pagename, selected, category_name))    52     53         # Initialise month lists.    54     55         start_month_list = []    56         start_month_list.append('<option value=""></option>')    57         end_month_list = []    58         end_month_list.append('<option value=""></option>')    59     60         start_month = self._get_input(form, "start-month", 0)    61         end_month = self._get_input(form, "end-month", 0)    62     63         # Prepare month lists, selecting specified months.    64     65         for month in range(1, 13):    66             month_label = _(EventAggregatorSupport.getMonthLabel(month))    67             selected = self._get_selected(month, start_month)    68             start_month_list.append('<option value="%02d" %s>%s</option>' % (month, selected, month_label))    69             selected = self._get_selected(month, end_month)    70             end_month_list.append('<option value="%02d" %s>%s</option>' % (month, selected, month_label))    71     72         # Permitting configuration of the template name.    73     74         template_default = getattr(request.cfg, "event_aggregator_new_event_template", "EventTemplate")    75     76         d = {    77             "buttons_html"          : buttons_html,    78             "category_label"        : _("Categories"),    79             "category_list"         : "\n".join(category_list),    80             "start_month_list"      : "\n".join(start_month_list),    81             "end_month_list"        : "\n".join(end_month_list),    82             "start_label"           : _("Start date (day, month, year)"),    83             "start_day_default"     : form.get("start-day", [""])[0],    84             "start_year_default"    : form.get("start-year", [""])[0] or EventAggregatorSupport.getCurrentYear(),    85             "end_label"             : _("End date (day, month, year) - if different"),    86             "end_day_default"       : form.get("end-day", [""])[0],    87             "end_year_default"      : form.get("end-year", [""])[0],    88             "title_label"           : _("Event title/summary"),    89             "title_default"         : form.get("title", [""])[0],    90             "description_label"     : _("Event description"),    91             "description_default"   : form.get("description", [""])[0],    92             "template_label"        : _("Event template"),    93             "template_default"      : form.get("template", [""])[0] or template_default,    94             "parent_label"          : _("Parent page"),    95             "parent_default"        : form.get("parent", [""])[0],    96             }    97     98         return '''    99 <table>   100     <tr>   101         <td class="label"><label>%(title_label)s</label></td>   102         <td>   103             <input name="title" type="text" size="40" value="%(title_default)s" />   104         </td>   105     </tr>   106     <tr>   107         <td class="label"><label>%(category_label)s</label></td>   108         <td class="content">   109             <select multiple="multiple" name="category">   110                 %(category_list)s   111             </select>   112         </td>   113     </tr>   114     <tr>   115         <td class="label"><label>%(start_label)s</label></td>   116         <td>   117             <input name="start-day" type="text" value="%(start_day_default)s" size="2" />   118             <select name="start-month">   119                 %(start_month_list)s   120             </select>   121             <input name="start-year" type="text" value="%(start_year_default)s" size="4" />   122         </td>   123     </tr>   124     <tr>   125         <td class="label"><label>%(end_label)s</label></td>   126         <td>   127             <input name="end-day" type="text" value="%(end_day_default)s" size="2" />   128             <select name="end-month">   129                 %(end_month_list)s   130             </select>   131             <input name="end-year" type="text" value="%(end_year_default)s" size="4" />   132         </td>   133     </tr>   134     <tr>   135         <td class="label"><label>%(description_label)s</label></td>   136         <td>   137             <input name="description" type="text" size="40" value="%(description_default)s" />   138         </td>   139     </tr>   140     <tr>   141         <td class="label"><label>%(template_label)s</label></td>   142         <td>   143             <input name="template" type="text" size="40" value="%(template_default)s" />   144         </td>   145     </tr>   146     <tr>   147         <td class="label"><label>%(parent_label)s</label></td>   148         <td>   149             <input name="parent" type="text" size="40" value="%(parent_default)s" />   150         </td>   151     </tr>   152     <tr>   153         <td></td>   154         <td class="buttons">   155             %(buttons_html)s   156         </td>   157     </tr>   158 </table>   159 ''' % d   160    161     def do_action(self):   162    163         "Create the new event."   164    165         _ = self._   166         form = self.request.form   167    168         # If no title exists in the request, an error message is returned.   169    170         title = form.get("title", [None])[0]   171         template = form.get("template", [None])[0]   172    173         if not title:   174             return 0, _("No event title specified.")   175    176         if not template:   177             return 0, _("No page template specified.")   178    179         return self.create_event(self.request)   180    181     def render_success(self, msg, msgtype=None):   182    183         """   184         Render neither 'msg' nor 'msgtype' since redirection should occur   185         instead.   186         NOTE: msgtype is optional because MoinMoin 1.5.x does not support it.   187         """   188    189         pass   190    191     def create_event(self, request):   192    193         "Create an event page using the 'request'."   194    195         _ = request.getText   196         form = request.form   197    198         category_pagenames = form.get("category", [])   199         description = form.get("description", [None])[0]   200    201         try:   202             title = form["title"][0]   203             template = form["template"][0]   204             parent = form["parent"][0]   205    206             start_day = self._get_input(form, "start-day", 0)   207             start_month = self._get_input(form, "start-month", 0)   208             start_year = self._get_input(form, "start-year", 0)   209             end_day = self._get_input(form, "end-day", start_day)   210             end_month = self._get_input(form, "end-month", start_month)   211             end_year = self._get_input(form, "end-year", start_year)   212    213             start_year, start_month, start_day = self.constrain_date(start_year, start_month, start_day)   214             end_year, end_month, end_day = self.constrain_date(end_year, end_month, end_day)   215    216         except (TypeError, ValueError):   217             return 0, _("Days and years must be numbers yielding a valid date!")   218    219         except (KeyError, IndexError):   220             return 0, _("Event title or template missing.")   221    222         start_date = self.make_date_string(start_year, start_month, start_day)   223         end_date = self.make_date_string(end_year, end_month, end_day)   224    225         # Copy the template.   226    227         page = PageEditor(request, template)   228    229         if not page.exists():   230             return 0, _("Event template not available.")   231    232         event_page = EventAggregatorSupport.EventPage(page)   233    234         # Use any parent page information.   235    236         if parent:   237             full_title = "%s/%s" % (parent.rstrip("/"), title)   238         else:   239             full_title = title   240    241         # Load the new page and replace the event details in the body.   242    243         new_page = PageEditor(request, full_title)   244    245         if new_page.exists():   246             return 0, _("The specified page already exists. Please choose another name.")   247    248         new_event_page = EventAggregatorSupport.EventPage(new_page)   249         new_event_page.copyPage(event_page)   250    251         if new_event_page.getFormat() == "wiki":   252             event_details = {   253                 "start" : start_date, "end" : end_date,   254                 "title" : title, "summary" : title,   255                 "description" : description   256                 }   257             new_event = EventAggregatorSupport.Event(new_event_page, event_details)   258             new_event_page.setEvents([new_event])   259             new_event_page.setCategoryMembership(category_pagenames)   260             new_event_page.saveChanges()   261    262         # Redirect and return success.   263    264         query = {'action' : 'edit'}   265         request.http_redirect(new_page.url(request, query))   266         return 1, None   267    268     def make_date_string(self, year, month, day):   269         return "%s-%s-%s" % (   270             year and ("%04d" % year) or "YYYY",   271             month and ("%02d" % month) or "MM",   272             day and ("%02d" % day) or "DD"   273             )   274    275     def constrain_date(self, year, month, day):   276         if year and month and day:   277             wd, last_day = calendar.monthrange(year, month)   278             day = max(min(day, last_day), 1)   279         return year, month, day   280    281 # Action function.   282    283 def execute(pagename, request):   284     EventAggregatorNewEvent(pagename, request).render()   285    286 # vim: tabstop=4 expandtab shiftwidth=4