1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - EventAggregatorNewEvent Action 4 5 @copyright: 2008, 2009 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, month, input_month): 29 return input_month is not None and month == input_month and 'selected="selected"' or '' 30 31 def _get_input(self, form, name, default, error): 32 try: 33 return int(form.get(name, [None])[0] or default) 34 except ValueError: 35 return error 36 37 def get_form_html(self, buttons_html): 38 _ = self._ 39 request = self.request 40 form = request.form 41 42 category_list = [] 43 44 for category_name, category_pagename in \ 45 EventAggregatorSupport.getCategoryMapping( 46 EventAggregatorSupport.getCategories(request), 47 request): 48 49 category_list.append('<option value="%s">%s</option>' % (category_pagename, category_name)) 50 51 # Initialise month lists. 52 53 start_month_list = [] 54 start_month_list.append('<option value=""></option>') 55 end_month_list = [] 56 end_month_list.append('<option value=""></option>') 57 58 start_month = self._get_input(form, "start-month", 0, None) 59 end_month = self._get_input(form, "end-month", 0, None) 60 start_year = self._get_input(form, "start-year", EventAggregatorSupport.getCurrentYear(), None) 61 end_year = self._get_input(form, "end-year", 0, None) 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 d = { 73 "buttons_html" : buttons_html, 74 "category_label" : _("Categories"), 75 "category_list" : "\n".join(category_list), 76 "start_month_list" : "\n".join(start_month_list), 77 "end_month_list" : "\n".join(end_month_list), 78 "start_label" : _("Start date (day, month, year)"), 79 "start_day_default" : form.get("start-day", [""])[0], 80 "start_year_default" : start_year, 81 "end_label" : _("End date (day, month, year)"), 82 "end_day_default" : form.get("end-day", [""])[0], 83 "end_year_default" : form.get("end-year", [""])[0], 84 "title_label" : _("Event title/summary"), 85 } 86 87 return ''' 88 <table> 89 <tr> 90 <td class="label"><label>%(title_label)s</label></td> 91 <td> 92 <input name="title" type="text" size="40" /> 93 <tr> 94 <td class="label"><label>%(category_label)s</label></td> 95 <td class="content"> 96 <select multiple="multiple" name="category"> 97 %(category_list)s 98 </select> 99 </td> 100 </tr> 101 <tr> 102 <td class="label"><label>%(start_label)s</label></td> 103 <td> 104 <input name="start-day" type="text" value="%(start_day_default)s" size="2" /> 105 <select name="start-month"> 106 %(start_month_list)s 107 </select> 108 <input name="start-year" type="text" value="%(start_year_default)s" size="4" /> 109 </td> 110 </tr> 111 <tr> 112 <td class="label"><label>%(end_label)s</label></td> 113 <td> 114 <input name="end-day" type="text" value="%(end_day_default)s" size="2" /> 115 <select name="end-month"> 116 %(end_month_list)s 117 </select> 118 <input name="end-year" type="text" value="%(end_year_default)s" size="4" /> 119 </td> 120 </tr> 121 <tr> 122 <td></td> 123 <td class="buttons"> 124 %(buttons_html)s 125 </td> 126 </tr> 127 </table> 128 ''' % d 129 130 def do_action(self): 131 132 "Create the new event." 133 134 _ = self._ 135 form = self.request.form 136 137 # If no title exists in the request, an error message is returned. 138 139 title = form.get("title", [None])[0] 140 141 if not title: 142 return 0, _("No event title specified.") 143 144 return self.create_event(self.request) 145 146 def render_success(self, msg, msgtype=None): 147 148 """ 149 Render neither 'msg' nor 'msgtype' since redirection should occur 150 instead. 151 NOTE: msgtype is optional because MoinMoin 1.5.x does not support it. 152 """ 153 154 pass 155 156 def create_event(self, request): 157 158 "Create an event page using the 'request'." 159 160 _ = request.getText 161 form = request.form 162 163 category_names = form.get("category", []) 164 title = form.get("title", [None])[0] 165 166 try: 167 start_day = self._get_input(form, "start-day", 0, None) 168 start_month = self._get_input(form, "start-month", 0, None) 169 start_year = self._get_input(form, "start-year", 0, None) 170 end_day = self._get_input(form, "end-day", start_day, None) 171 end_month = self._get_input(form, "end-month", start_month, None) 172 end_year = self._get_input(form, "end-year", start_year, None) 173 174 start_year, start_month, start_day = self.constrain_date(start_year, start_month, start_day) 175 end_year, end_month, end_day = self.constrain_date(end_year, end_month, end_day) 176 177 except ValueError: 178 return 0, _("Days and years must be numbers yielding a valid date!") 179 180 start_date = self.make_date_string(start_year, start_month, start_day) 181 end_date = self.make_date_string(end_year, end_month, end_day) 182 183 # Copy the template. 184 # Permitting configuration of the template name. 185 186 page = PageEditor(request, getattr(request.cfg, "event_aggregator_new_event_template", "EventTemplate")) 187 body = page.get_raw_body() 188 189 # Load the new page and replace the event details in the body. 190 191 new_page = PageEditor(request, title) 192 193 if new_page.exists(): 194 return 0, _("The specified page already exists. Please choose another name.") 195 196 if EventAggregatorSupport.getFormat(page) == "wiki": 197 event_details = {"start" : start_date, "end" : end_date, "title" : title, "summary" : title} 198 body = EventAggregatorSupport.setEventDetails(body, event_details) 199 body = EventAggregatorSupport.setCategoryMembership(body, category_names) 200 new_page.saveText(body, 0) 201 202 # Redirect and return success. 203 204 query = {'action' : 'edit'} 205 request.http_redirect(new_page.url(request, query)) 206 return 1, None 207 208 def make_date_string(self, year, month, day): 209 return "%s-%s-%s" % ( 210 year and ("%04d" % year) or "YYYY", 211 month and ("%02d" % month) or "MM", 212 day and ("%02d" % day) or "DD" 213 ) 214 215 def constrain_date(self, year, month, day): 216 if year and month and day: 217 wd, last_day = calendar.monthrange(year, month) 218 day = max(min(day, last_day), 1) 219 return year, month, day 220 221 # Action function. 222 223 def execute(pagename, request): 224 EventAggregatorNewEvent(pagename, request).render() 225 226 # vim: tabstop=4 expandtab shiftwidth=4