Example #1
0
    def make_form(self, html_class="settings_form"):
        """
        Create the FORM, and the DIVs with the input fields
        """
        if config.use_ssl:
            action = self.request.getScriptname() + self.request.getPathinfo()
            if config.wiki_farm:
                action = "%s%s" % (farm.getBaseFarmURL(
                                       self.request, force_ssl=config.use_ssl),
                                   wikiutil.quoteWikiname(
                                        config.page_user_preferences))
            else:
                action = '%s/%s' % (self.request.getQualifiedURL(
                                        self.request.getScriptname(),
                                        force_ssl=config.use_ssl),
                                    wikiutil.quoteWikiname(
                                        config.page_user_preferences))
        else:
            action = self.request.getScriptname() + self.request.getPathinfo()
        self._form = html.FORM(action=action)
        self._inner = html.DIV(html_class=html_class)

        # Use the user interface language and direction
        lang_attr = self.request.theme.ui_lang_attr()
        self._form.append(html.Raw("<div %s>" % lang_attr))

        self._form.append(html.INPUT(type="hidden", name="action",
                                     value="userform"))
        if self.from_wiki:
            self._form.append(html.INPUT(type="hidden", name="from_wiki",
                                       value=self.from_wiki))
        self._form.append(self._inner)
        self._form.append(html.Raw("</div>"))
Example #2
0
    def navbar(self, d):
        """
        Assemble the new nav bar
        
        @param d: parameter dictionary
        @rtype: string
        @return: navibar html
        """
        _ = self.request.getText

        lower_page_name = d['page_name'].lower()
        
        if self.request.user.valid:
            html = ['<div class="tabArea">']
            in_preset_tab = False
            for tab in self.request.config.tabs_user:
                tabclass = 'tab'
                lower_tab = tab.lower()
                if lower_tab == lower_page_name:
                    tabclass = '%s activeTab' % tabclass
                    in_preset_tab = True
                if (lower_tab == 'bookmarks' and
                    self.request.user.hasUnseenFavorite()):
                    tabclass = '%s notice' % tabclass
                elif (lower_tab == 'interwiki bookmarks' and
                      self.request.user.hasUnseenFavorite(wiki_global=True)):
                    tabclass = '%s notice' % tabclass

                html.append(('<a href="%(script_name)s/%%s" class="%%s">%%s</a>' % d) %
                            (wikiutil.quoteWikiname(tab), tabclass, tab))

            if not in_preset_tab and d['page_name']:
                html.append('<a href="%(script_name)s/%(q_page_name)s" '
                               'class="tab activeTab">%(page_name)s</a>' % d)
        else:
            html = ['<div class="tabArea">']
            in_preset_tab = False
            for tab in self.request.config.tabs_nonuser:
                tabclass = 'tab'
                lower_tab = tab.lower()
                if lower_tab == lower_page_name:
                    tabclass = '%s activeTab' % tabclass
                    in_preset_tab = True

                html.append(
                    ('<a href="%(script_name)s/%%s" class="%%s">%%s</a>' % d) %
                    (wikiutil.quoteWikiname(tab), tabclass, tab))

            if not in_preset_tab and d['page_name']:
              html.append(('<a href="%(script_name)s/%(q_page_name)s" '
                             'class="tab activeTab">%(page_name)s</a>' % d))

        html.append('</div>')
        html = ''.join(html)

        return html
Example #3
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    action = 'Files'
    pagename = formatter.page.page_name
    baseurl = macro.request.getScriptname()
    urlpagename = wikiutil.quoteWikiname(formatter.page.proper_name())

    if not args:
        return formatter.rawHTML('<b>Please supply at least a file name, '
                                 'e.g. [[File(filename.txt)]], where '
                                 'filename.txt is a file that\'s been '
                                 'uploaded to this page.</b>')
    filename = args

    macro.request.cursor.execute("""SELECT name
                                    FROM files
                                    WHERE name=%(filename)s and
                                          attached_to_pagename=%(pagename)s and
                                          wiki_id=%(wiki_id)s""",
                                 {'filename':filename,
                                  'pagename':pagename.lower(),
                                  'wiki_id':macro.request.config.wiki_id})
    result = macro.request.cursor.fetchone()
    file_exists = result

    urlfile = urllib.quote(filename)
    if not file_exists:
        #lets make a link telling them they can upload the file
        linktext = 'Upload new file "%s"' % (filename)
        return wikiutil.attach_link_tag(
            macro.request,
            '%s?action=Files&amp;rename=%s%s#uploadFileArea' % (
                wikiutil.quoteWikiname(formatter.page.proper_name()),
                urlfile,
                ''),
            linktext)

    urlfile = urllib.quote(filename)
    html = ('<span class="fileLink"><img src="%(icon)s"/>'
            '<a href="%(baseurl)s/%(urlpagename)s?action=%(action)s&amp;'
                     'do=view&target=%(urlfile)s">'
                '%(file)s'
            '</a></span>' %
            {'icon':Files.get_icon(filename, macro.request), 'baseurl':baseurl,
             'urlpagename':urlpagename, 'urlfile':urlfile, 'file':filename,
             'action':action})
    return html
Example #4
0
    def _macro_titleindex(self, args, formatter=None):
        if not formatter:
            formatter = self.formatter
        _ = self._
        html = []
        index_letters = []
        allpages = int(self.form.get('allpages', [0])[0]) != 0
        pages = wikiutil.getPageList(self.request, alphabetize=False)
        pages_deco = [ (pagename.lower(), pagename) for pagename in pages ]
        pages_deco.sort()
        pages = [ word for lower_word, word in pages_deco ]
        current_letter = None
        for name in pages:
            if 1: #self.request.user.may.read(name):
                letter = name[0].upper()
                # XXX UNICODE - fix here, too?
                if wikiutil.isUnicodeName(letter):
                    try:
                        letter = wikiutil.getUnicodeIndexGroup(
                            unicode(name, config.charset))
                        if letter:
                            letter = letter.encode(config.charset)
                    except UnicodeError:
                        letter = None
                    if not letter: letter = "~"
                if letter not in index_letters:
                    index_letters.append(letter)
                if letter <> current_letter:
                    html.append('<a name="%s"><h3>%s</h3></a>' % (
                        wikiutil.quoteWikiname(letter),
                        letter.replace('~', 'Others')))
                    current_letter = letter
                else:
                    html.append('<br>')
                html.append('<a href="%s%s">%s</a>\n' %
                    (self.request.getScriptname(),
                     wikiutil.quoteWikiname(name), name))

        index = ''
        qpagename = wikiutil.quoteWikiname(self.formatter.page.page_name)
        index = index + _make_index_key(index_letters)
        return '%s%s' % (index, ''.join(html)) 
Example #5
0
 def username(self, d):
     """
     Assemble the username / userprefs link
     
     @param d: parameter dictionary
     @rtype: string
     @return: username html
     """
     html = '<div id="username">%s</div>' % wikiutil.link_tag(
         self.request, wikiutil.quoteWikiname(d['page_user_prefs']),
         wikiutil.escape(d['user_prefs']))
     return html
Example #6
0
    def talkicon(self, d):
        if not self.request.config.talk_pages:
            return ''

        if d['page'].isTalkPage():
           article_name = wikiutil.talk_to_article_pagename(d['page_name'])

           icon = self.get_editable_icon('articleicon.png', 'Article')
           
           return ('<td class="pageIcon"><span id="articleIcon">'
                   '%s</span></td>' %
                   (wikiutil.link_tag_explicit(
                       'style="text-decoration: none;"', self.request,
                       wikiutil.quoteWikiname(article_name), icon,
                       script_name=d['script_name'])))
        else:
            talk_page = Page(wikiutil.article_to_talk_pagename(d['page_name']),
                             self.request)

            icon = self.get_editable_icon('talkicon.png', 'Talk')

            if talk_page.exists():
                return ('<td class="pageIcon"><span id="talkIcon">'
                        '%s</span></td>' %
                        (wikiutil.link_tag_explicit(
                            'style="text-decoration: none;"', self.request,
                            wikiutil.quoteWikiname(d['page_name'])+'/Talk',
                            icon, script_name=d['script_name'])))
            else:
                # if the viewer can't edit the talk page, let's spare them
                # from looking at a useless link to an empty page:
                if not self.request.user.may.edit(talk_page):
                    return ''
                return ('<td class="pageIcon"><span id="talkIcon">'
                        '%s</span></td>' %
                        (wikiutil.link_tag_explicit(
                            'class="tinyNonexistent"', self.request,
                            wikiutil.quoteWikiname(d['page_name'])+'/Talk',
                            icon, script_name=d['script_name'])))
Example #7
0
    def infoicon(self, d):
        if self.isInfo():
            status = 'Selected' 
        else:
            status = ''
        icon = self.get_editable_icon('infoicon.png', 'Info')

        return '<td class="pageIcon%s"><span id="infoIcon">%s</span></td>' % (
            status,
            wikiutil.link_tag_explicit('style="text-decoration: none;"',
                                       self.request,
                                       wikiutil.quoteWikiname(d['page_name'])+
                                           '?action=info',
                                       icon, script_name=d['script_name']))
Example #8
0
 def logo(self, d):
     """
     Assemble the logo
     
     @param d: parameter dictionary
     @rtype: string
     @return: logo html
     """
     if d['logo_string']:
         html = '<div id="logo">%s</div>' % wikiutil.link_tag(
             self.request, wikiutil.quoteWikiname(d['page_front_page']),
             d['logo_string'])
     else:
         html = ''
     return html
Example #9
0
    def interwikiurl(self, url, **kw):
        """
        Return the URL and status information for the interwiki page.
        @rtype: tuple containing: (page url, wikitag, wikiurl, wikitail,
                                   wikitag_bad, wikitype)
        """
        wikitag, wikiurl, wikitail, wikitag_bad, wikitype = \
            wikiutil.resolve_wiki(self.request, url,
                                  force_farm=kw.get('force_farm'))
        wikiurl = wikiutil.mapURL(wikiurl)

        if wikitype == wikiutil.INTERWIKI_FARM_TYPE:
            wikitail = wikiutil.quoteWikiname(wikitail)

        href = wikiutil.join_wiki(wikiurl, wikitail)
        return (href, wikitag, wikiurl, wikitail, wikitag_bad, wikitype)
Example #10
0
 def editicon(self,d):
     editable = self.request.user.may.edit(d['page'])
     if editable:
         icon = self.get_editable_icon('editicon.png', 'Edit')
         if self.isEdit():
             return ('<td class="pageIconSelected">'
                     '<span id="editIcon">%s</span></td>' % icon)
         else:
             return ('<td class="pageIcon"><span id="editIcon">'
                     '%s</span></td>' %
                     (wikiutil.link_tag_explicit(
                         'style="text-decoration: none;"', self.request,
                         wikiutil.quoteWikiname(d['page_name']) + 
                             '?action=edit',
                         '%s' % icon, script_name=d['script_name'])))
     return ''
Example #11
0
 def _macro_search(self, arg, formatter=None):
     if not formatter:
         formatter = self.formatter
     alt, img_url, x, y = self.request.theme.get_icon('searchbutton')
     d = {'img_url':img_url, 'alt':alt,
           'q_pagename':wikiutil.quoteWikiname(formatter.page.page_name)}
     if arg and arg.lower() == 'global':
         d['search_action'] = 'global_search'
     else:
         d['search_action'] = 'search'
     search_html = (
         '<span><form method="GET" action="%(q_pagename)s" '
                      'style="display:inline !important;">'
         '<input type="hidden" name="action" value="%(search_action)s">'
         '<input class="formfields" type="text" name="inline_string" '
                 'value="" size="25" maxlength="50">&nbsp;'
         '<input type="image" src="%(img_url)s" alt="%(alt)s">&nbsp;&nbsp;'
         '</form></span>' % d)
     return formatter.rawHTML(search_html)
Example #12
0
def execute(macro, args, formatter=None):
    request = macro.request
    before_form, after_form = '', ''
    if args and len(args.split(',')) == 2:
        before_form, after_form = args.split(',')
    if not formatter:
        formatter = macro.formatter
    if not config.allow_web_based_wiki_creation:
        return ('<i>This wiki farm does not have web-based wiki creation '
                'enabled.</i>')
    if request.user.valid:
            d = {'form_action': formatter.page.url(),
                'wikiname_length': farm.WIKINAME_MAX_LENGTH,
                'create_wiki_button': 'send_email',
                'after_form': after_form,
                'before_form': before_form,
            }
            wiki_create_form = (
                '<form action="%(form_action)s" method="POST">\n'
                '<span class="wikiNameArea">'
                '<input type="hidden" name="action" value="new_wiki">\n'
                '%(before_form)s'
                '<input type="text" class="wikiname" name="wikiname" '
                       'size="15" value="shortname" '
                       'maxlength="%(wikiname_length)s" '
                       'onFocus="this.value=\'\';this.style.color=\'black\';return false;">\n'
                '<input type="hidden" name="%(create_wiki_button)s" '
                       'value="1">\n'
                '<span class="description">%(after_form)s</span>'
                '</span>'
                '<span class="submit"><input type="submit" value="Create wiki"></span>\n'
                '</form>\n' % d)
    else:
        new_user_link = ('%s%s?new_user=1' %
                         (farm.getBaseFarmURL(request),
                          wikiutil.quoteWikiname(
                              config.page_user_preferences)))
        wiki_create_form = ('You must be logged in to create a wiki!  '
                            'To create an account, go '
                            '<a href="%s">here</a>.' % new_user_link)
    return formatter.rawHTML('<span id="wikiCreateForm">%s</span>' %
                             wiki_create_form) 
Example #13
0
def full_events(events, are_events_today, htmltext, macro):
    old_date = ''

    event_timezone = macro.request.config.tz

    # clear events that have passed
    yesterday_struct = time.gmtime(time.time()-60*60*24)
    yesterday = list(yesterday_struct[0:3]) + [0,0,0,0,0,0]
    yesterday = calendar.timegm(yesterday)
    macro.request.cursor.execute("""SELECT event_name, event_time
                                    FROM events
                                    WHERE event_time<%(yesterday)s and
                                          wiki_id=%(wiki_id)s""",
                                 {'yesterday':yesterday,
                                  'wiki_id':macro.request.config.wiki_id})
    macro.request.cursor.execute("""DELETE FROM events
                                    WHERE event_time<%(yesterday)s and
                                          wiki_id=%(wiki_id)s""",
                                 {'yesterday':yesterday,
                                  'wiki_id':macro.request.config.wiki_id})
    macro.request.cursor.execute(
        """SELECT uid, event_time, posted_by, text, location, event_name
           FROM events
           WHERE wiki_id=%(wiki_id)s
           ORDER BY event_time""", {'wiki_id':macro.request.config.wiki_id})
    result = macro.request.cursor.fetchone()
    while result:
        events.append(result) 
        result = macro.request.cursor.fetchone()

    current_time = macro.request.user.getFormattedDateTime(time.time())
    year_cut = string.split(current_time," ")[0]
    current_year = string.split(year_cut, "-")[0]
    month_cut = string.split(current_time," ")[0]
    current_month = string.split(month_cut,"-")[1]
    day_cut = string.split(current_time," ")[0]
    current_day = string.split(day_cut,"-")[2]
    hour_cut = string.split(current_time," ")[1]
    current_hour = string.split(hour_cut,":")[0]
    minute_cut = string.split(current_time," ")[1]
    current_minute = string.split(minute_cut,":")[1]

    for event in events:
            event_name = event[5]
            # we store it as a general time and we convert it to a local time..
            event_time_unix = event[1]

            event_time_struct = wikiutil.timeInUnixToLocal(
                                    macro.request.config.tz, event_time_unix)
            year = event_time_struct[0]
            month = event_time_struct[1]
            day = event_time_struct[2]
            hour = event_time_struct[3]
            minute = event_time_struct[4]
            posted_by = event[2]
            id = event[0]
            date = str(month) + " " +  str(day)

            if int(hour) > 12 :
               read_hour = int(hour) - 12
               if not int(minute) == 0:
                    ptime = str(read_hour) + ":" + str(minute) + " PM"
               else:
                    ptime = str(read_hour) + ":00" + " PM"
            elif int(hour) == 0:
                if not int(minute) == 0:        
                    ptime = "12:" + str(minute) + " AM"
                else:
                    ptime = "12:00 AM"
            elif int(hour) == 12:
                if not int(minute) == 0:
                    ptime = "12:" + str(minute) + " PM"
                else:
                    ptime = "12:00 PM"
            else:
                if not int(minute) == 0:
                   ptime = str(hour) + ":" + str(minute) + " AM"  
                else:
                   ptime = str(hour) + ":00 AM"

            ptime = "%s (%s)" % (ptime, macro.request.config.tz)
                
            # This is where we want to run through the wiki processor        
            text = event[3]

            event_location = event[4]
            processed_text = doParse(text,macro,keep_outer_paragraph=True)
            processed_location = doParse(event_location,macro)
            processed_name = doParse(event_name,macro)
            month_dict = {1:'January', 2:'February', 3:'March', 4:'April',
                          5:'May', 6:'June', 7:'July', 8:'August',
                          9:'September', 10:'October', 11:'November',
                          12:'December'}
            string_month = month_dict[month]
            events_page = Page("Events Board", macro.request)
            posted_by_user = user.User(macro.request, name=posted_by)
            user_link = user.getUserLink(macro.request, posted_by_user)
            if (macro.request.user.may.admin(events_page) or
                posted_by == macro.request.user.propercased_name): 
                    if date == old_date:
                        htmltext.append(
                            '<ul>\n<h4 id="head-%s">%s</h4>\n'
                            '<a href="%s/Events_Board?action=events&uid=%s&'
                                     'del=1">[delete]</a>'
                            '&nbsp;&nbsp;<b>Time:</b> %s<br>\n'
                            '<b>Location:</b> %s<br>\n'
                            '%s(Posted by %s)\n</ul>\n' %
                            (id, processed_name, macro.request.getScriptname(),
                             id, ptime, processed_location, processed_text,
                             user_link))
                    else:
                        string_day = datetoday(int(day),int(month),int(year))
                        old_date = date
                        htmltext.append(
                            '<h2>%s, %s %s, %s</h2>\n'
                            '<ul><h4 id="head-%s">%s</h4>\n'
                            '<a href="%s/Events_Board?action=events&uid=%s&'
                                     'del=1">[delete]</a>'
                            '&nbsp;&nbsp;<b>Time:</b> '
                            '%s&nbsp;&nbsp;&nbsp;&nbsp;\n'
                            '<b>Location:</b> %s<br>\n'
                            '%s(Posted by %s)\n</ul>\n' %
                            (string_day, string_month, day, year, id,
                             processed_name,macro.request.getScriptname(), id,
                             ptime, processed_location, processed_text,
                             user_link))

            else:
                if date == old_date:
                        htmltext.append(
                            '<ul>\n<h4 id="head-%s">%s</h4>\n'
                            '<b>Time:</b> %s<br>\n'
                            '<b>Location:</b> %s<br>\n'
                            '%s(Posted by %s)\n</ul>\n' %
                            (id, processed_name, ptime, processed_location,
                             processed_text, user_link))                                   

                else:                                        
                        string_day = datetoday(int(day),int(month),int(year))                                        
                        old_date = date
                        htmltext.append(
                            '<h2>%s, %s %s</h2>\n'
                            '<ul>\n<h4 id="head-%s">%s</h4>\n'
                            '<b>Time:</b> %s&nbsp;&nbsp;&nbsp;&nbsp;\n' 
                            '<b>Location:</b> %s<br>\n'
                            '%s(Posted by %s)\n</ul>\n' %
                            (string_day, string_month, day, id, processed_name,
                             ptime, processed_location, processed_text,
                             user_link))

    title = "Post a new event:"
    htmltext.append(
        '<h3>%s</h3>\n'
        '<table border="0" cellspacing="0" cellpadding="3">\n'
        '<tr><td><form method="POST" action="%s/%s">\n'
        '<input type="hidden" name="action" value="events">\n'
        '<input type="hidden" name="ticket" value="%s">\n'
        'Event name: <input class="formfields" type="text" name="event_name"'
                           'size="30" maxlength="100">&nbsp;\n'
        'Location: <input class="formfields" type="text" '
                         'name="event_location" size="25" maxlength="100">'
        '<br><br>\n' %
        (title, macro.request.getScriptname(),
         wikiutil.quoteWikiname(macro.formatter.page.proper_name()),
         createTicket()))

    monthstring = ('<p>Date: <select name="month">\n'
                   '<option value="1">January</option>\n'
                   '<option value="2">February</option>\n'
                   '<option value="3">March</option>\n'
                   '<option value="4">April</option>\n'
                   '<option value="5">May</option>\n'
                   '<option value="6">June</option>\n'
                   '<option value="7">July</option>\n '
                   '<option value="8">August</option>\n'
                   '<option value="9">September</option>\n'
                   '<option value="10">October</option>\n'
                   '<option value="11">November</option>\n'
                   '<option value="12">December</option>\n</select>\n')
    newmonthstring = monthstring.replace(
        'value="%s"' % str(int(current_month)),
        'value="%s" selected' % str(int(current_month)))
    htmltext.append(newmonthstring)
    
    daystring = ('<select name="day">\n '
                 '<option>1</option>\n '
                 '<option>2</option>\n '
                 '<option>3</option>\n '
                 '<option>4</option>\n '
                 '<option>5</option>\n '
                 '<option>6</option>\n '
                 '<option>7</option>\n '
                 '<option>8</option>\n '
                 '<option>9</option>\n '
                 '<option>10</option>\n '
                 '<option>11</option>\n '
                 '<option>12</option>\n '
                 '<option>13</option>\n '
                 '<option>14</option>\n '
                 '<option>15</option>\n '
                 '<option>16</option>\n '
                 '<option>17</option>\n '
                 '<option>18</option>\n '
                 '<option>19</option>\n '
                 '<option>20</option>\n '
                 '<option>21</option>\n '
                 '<option>22</option>\n '
                 '<option>23</option>\n '
                 '<option>24</option>\n '
                 '<option>25</option>\n '
                 '<option>26</option>\n '
                 '<option>27</option>\n '
                 '<option>28</option>\n '
                 '<option>29</option>\n '
                 '<option>30</option>\n '
                 '<option>31</option>\n '
                 '</select>\n')
    newdaystring = daystring.replace(">"+str(int(current_day))+"<",
                                     " selected>"+str(int(current_day))+"<")
    htmltext.append(newdaystring)
    
    yearstring = '<select name="year">\n'
    for year in yearList():
        yearstring += '<option>%s</option>\n' % year
    yearstring += '</select>'
    newyearstring = yearstring.replace(">" + current_year + "<",
                                       " selected>" + current_year + "<")
    htmltext.append(newyearstring)

    hourstring = ('Time: <select name="hour">\n '
                  '<option value="0">12AM</option>\n '
                  '<option value="1">1AM</option>\n '
                  '<option value="2">2AM</option>\n '
                  '<option value="3">3AM</option>\n '
                  '<option value="4">4AM</option>\n '
                  '<option value="5">5AM</option>\n '
                  '<option value="6">6AM</option>\n '
                  '<option value="7">7AM</option>\n '
                  '<option value="8">8AM</option>\n '
                  '<option value="9">9AM</option>\n '
                  '<option value="10">10AM</option>\n '
                  '<option value="11">11AM</option>\n '
                  '<option value="12">12PM</option>\n '
                  '<option value="13">1PM</option>\n '
                  '<option value="14">2PM</option>\n '
                  '<option value="15">3PM</option>\n '
                  '<option value="16">4PM</option>\n '
                  '<option value="17">5PM</option>\n '
                  '<option value="18">6PM</option>\n '
                  '<option value="19">7PM</option>\n '
                  '<option value="20">8PM</option>\n '
                  '<option value="21">9PM</option>\n '
                  '<option value="22">10PM</option>\n '
                  '<option value="23">11PM</option>\n '
                  '</select>\n')
    newhourstring = hourstring.replace('value="%s"' % str(int(current_hour)),
                                       'value="%s" selected' %
                                           str(int(current_hour)))
    htmltext.append(newhourstring)

    if not str(int(int(current_minute)/10)) == 0:
       rounded_min = str(int(int(current_minute)/10)) + "0"
    else:
       rounded_min = "0"
    minutestring = (' : <select name="minute">\n '
                    '<option value="0">00</option>\n '
                    '<option value="10">10</option>\n '
                    '<option value="20">20</option>\n '
                    '<option value="30">30</option>\n '
                    '<option value="40">40</option>\n '
                    '<option value="50">50</option>\n '
                    '</select> (in %s)</p>\n' % event_timezone)
    newminutestring = minutestring.replace('value="%s"' % rounded_min,
                                           'value="%s" selected' % rounded_min)
    htmltext.append(newminutestring)

    htmltext.append(
                '<textarea name="event_text" rows="5" cols="67" wrapping=yes>'
                'Describe event</textarea><br>\n'
                '<input class="formbutton" type="submit" name="button" '
                       'value="Add Event">\n'
                '</form></td></tr></table>')
Example #14
0
def execute(macro, args, formatter=None, **kw):
    if not formatter:
        formatter = macro.formatter
    request = macro.request
    _ = request.getText
    pagename = macro.formatter.page.page_name
    pagename_propercased = macro.formatter.page.proper_name()
    cursor = request.cursor

    tnow = time.time()
    msg = ""

    pages = {}
    ignore_pages = {}

    today = request.user.getTime(tnow)[0:3]
    this_day = today
    day_count = 0
    local_favoriteList = []

    if not request.user.id:
        # not logged in user
        request.write('<p>You must be logged in to use the bookmarks '
                      'functionality.  Bookmarks let you easily keep track of '
                      'pages you think are interesting.</p>')
        return ''

    if args and args == 'global':
        wiki_global = True
    else:
        wiki_global = False

    all_favorites = request.user.getFavoriteList(wiki_global=wiki_global)
    changed_favorites = wikidb.getRecentChanges(
        request, per_page_limit=1, userFavoritesFor=request.user.id,
        wiki_global=wiki_global)
    local_favoriteList = groupFavorites(changed_favorites, all_favorites)

    from Sycamore.formatter.text_html import Formatter
    from Sycamore import user
    formatter = Formatter(request)
        
    if not wiki_global:
        rss_html = (
            '<link rel=alternate type="application/rss+xml" '
                  'href="%s/%s?action=rss_rc&amp;bookmarks=1&amp;user=%s" '
                  'title="Recent Changes on %s\'s bookmarks">'
            '<div style="float:right;">'
            '<a title="%s\'s Bookmarks RSS Feed" '
               'href="%s/%s?action=rss_rc&amp;bookmarks=1&amp;user=%s" '
               'style="border:1px solid;border-color:#FC9 #630 #330 #F96;'
                      'padding:0 3px;font:bold 10px verdana,sans-serif;'
                      'color:#FFF!important;background:#F60;text-decoration:none;'
                      'margin:0;">'
            'RSS</a></div>' %
            (request.getScriptname(),
             wikiutil.quoteWikiname(pagename_propercased),
             urllib.quote_plus(request.user.propercased_name),
             request.user.propercased_name, request.user.propercased_name,
             request.getScriptname(),
             wikiutil.quoteWikiname(pagename_propercased),
             urllib.quote_plus(request.user.propercased_name)))
    else:
        rss_html = (
            '<link rel=alternate type="application/rss+xml" '
                  'href="%s/%s?action=rss_rc&amp;bookmarks=1&amp;user=%s" '
                  'title="Recent Changes on %s\'s bookmarks">'
            '<div style="float:right;">'
            '<a title="%s\'s Interwiki Bookmarks RSS Feed" '
               'href="%s/%s?action=rss_rc&amp;bookmarks=1&amp;user=%s&amp;'
                      'global=1" '
               'style="border:1px solid;border-color:#FC9 #630 #330 #F96;'
                      'padding:0 3px;font:bold 10px verdana,sans-serif;'
                      'color:#FFF;background:#F60;text-decoration:none;'
                      'margin:0;">'
            'RSS</a></div>' %
            (request.getScriptname(),
             wikiutil.quoteWikiname(pagename_propercased),
             urllib.quote_plus(request.user.propercased_name),
             request.user.propercased_name, request.user.propercased_name,
             request.getScriptname(),
             wikiutil.quoteWikiname(pagename_propercased),
             urllib.quote_plus(request.user.propercased_name)))
    request.write(rss_html)
    request.write('<div class="bookmarks">')
    if not local_favoriteList:
        request.write('<p>Bookmarks let you easily keep track of pages you '
                      'think are interesting.</p>')
        if wiki_global:
            request.write('<p>This page will show you all of your bookmarks, '
                          'even if your bookmarks are on different wikis!</p>')
        request.write('<p><i>You have no Bookmarks.  To add a page click '
                      '"Bookmark this page" at the bottom of the page.'
                      '</i></p>')

    user_pages, other_pages = grab_user_pages(local_favoriteList, request)

    rendered_bookmarks = render_favorites(other_pages, request, formatter,
                                          macro, wiki_global)
    for pagename, line in rendered_bookmarks:
        request.write(line)
    if user_pages:
        rendered_profile_bookmarks = render_favorites(user_pages, request,
                                                      formatter, macro,
                                                      wiki_global)
        request.write('<h3 id="profiles">Your wiki profiles:</h3>')
        for pagename, line in rendered_profile_bookmarks:
            request.write(line)

    request.write('</div>') 

    return ''
Example #15
0
    def sendEditor(self, **kw):
        """
        Send the editor form page.

        @keyword preview: if given, show this text in preview mode
        @keyword staytop: don't go to #preview
        @keyword comment: comment field (when preview is true)
        @keyword had_conflict: we had an edit conflict on a save.
        """
        import re

        try:
            from Sycamore.action import SpellCheck
        except ImportError:
            SpellCheck = None

        form = self.request.form
        _ = self._
        self.request.http_headers([("Content-Type",
            "text/html; charset=%s" % config.charset)] + self.request.nocache)
        msg = None
        preview = kw.get('preview', None)
        emit_anchor = not kw.get('staytop', 0)
        proper_name = self.proper_name()

        from Sycamore.formatter.text_html import Formatter
        self.request.formatter = Formatter(self.request, store_pagelinks=1,
                                           preview=preview)

        base_uri = "%s/%s?action=edit" % (self.request.getScriptname(),
                                          wikiutil.quoteWikiname(
                                            self.proper_name()))
        backto = form.get('backto', [None])[0]
        if backto:
            base_uri += '&amp;' + util.web.makeQueryString(backto=backto)

        # check edit permissions
        if not self.request.user.may.edit(self):
            msg = _('You are not allowed to edit this page.')
        elif self.prev_date:
            # Trying to edit an old version, this is not possible via
            # the web interface, but catch it just in case...
            msg = _('Cannot edit old revisions!')

        # Is the IP address a Tor exit note?
        if config.block_tor_edits:
            tor = torcheck.torcheck()
            if tor.query(self.request.remote_addr): msg = _('You are not allowed to edit this page, %s.' % self.request.remote_addr)

        # Test against a number of DNSBLs
        if config.block_dnsbl_edits:
            # Test: is this an IP address?
            re1='((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])'
            rg = re.compile(re1,re.IGNORECASE|re.DOTALL)
            m = rg.search(self.request.remote_addr)
            if m:
                # this is an IP address
                # reverse IP address octets
                dq = self.request.remote_addr.split('.')
                dq.reverse()
                
                for dnsbl in config.block_dnsbl_edits:
                    querystring = '.'.join(dq)
                    querystring += '.' + dnsbl + '.'

                    try:
                        result = socket.gethostbyname(querystring)
                    except socket.gaierror:
                        # probably nxdomain
                        result = '0.0.0.0'

                    if result.startswith('127.0.0'):
                        # utoh
                        msg = _('You are not allowed to edit this page: %s listed on %s' % (self.request.remote_addr, dnsbl))

        # Did one of the prechecks fail?
        if msg and not kw.get('had_conflict', None):
            self.send_page(msg=msg)
            return

        # check for preview submit
        if preview is None:
            title = _('Edit "%(pagename)s"')
        else:
            title = _('Preview of "%(pagename)s"')
            self.set_raw_body(preview.replace("\r", ""), 1)

        page_needle = self.page_name
        if config.allow_subpages and page_needle.count('/'):
            page_needle = '/' + page_needle.split('/')[-1]

        wikiutil.send_title(self.request,
            self.proper_name(),
            pagename=self.proper_name(),
            has_link=True,
            strict_title='Editing "%s"' % self.proper_name(),
            body_onload = "sizeForIE('savetext', 100, 'editorComment', 99);"
        )

        # start content div
        self.request.write('<div id="content" class="content">\n')
        
        # get request parameters
        text_rows = None
        if form.has_key('rows'):
            text_rows = int(form['rows'][0])
            if self.request.user.valid:
                # possibly update user's pref
                if text_rows != self.request.user.edit_rows:
                    self.request.user.edit_rows = text_rows
                    self.request.user.save()
        else:
            text_rows = config.edit_rows
            if self.request.user.valid:
                text_rows = int(self.request.user.edit_rows)

        if form.has_key('cols'):
            text_cols = int(form['cols'][0])
            if self.request.user.valid:
                # possibly update user's pref
                if text_rows != self.request.user.edit_rows:
                    self.request.user.edit_rows = text_rows
                    self.request.user.save()
        else:
            text_cols = 80
            if self.request.user.valid:
                text_cols = int(self.request.user.edit_cols)

        # check datestamp (version) of the page our edit is based on
        if preview is not None:
            # propagate original datestamp
            mtime = float(form['datestamp'][0])

            # did someone else change the page while we were editing?
            conflict_msg = None
            if not self.exists():
                # page does not exist, are we creating it?
                if mtime:
                    conflict_msg = _('<p>Someone else <b>deleted</b> this '
                                     'page while you were editing!')
            elif mtime != self.mtime():
                conflict_msg = _('<p>Someone else changed this page while '
                                 'you were editing.')
                # merge conflicting versions
                allow_conflicts = 1
                from Sycamore.util import diff3
                savetext = self.get_raw_body()
                oldpg = Page(self.page_name, self.request, prev_date=mtime)
                original_text = oldpg.get_raw_body()
                saved_text = Page(self.page_name, self.request).get_raw_body()
                verynewtext, had_conflict = diff3.text_merge(
                    original_text, saved_text, savetext,
                    marker1='----- /!\ Edit conflict! Your version: -----\n',
                    marker2='----- /!\ Edit conflict! Other version: -----\n',
                    marker3='----- /!\ End of edit conflict -----\n')
                if had_conflict and self.request.user.valid and (
                   self.request.user.id == self.last_edit_info()[1]):
                    # user pressed back button or did something weird
                    conflict_msg =None
                elif had_conflict:
                    conflict_msg = _(conflict_msg + 
                                     'There was an <b>edit conflict between '
                                     'your changes!</b></p>'
                                     '<p>Please review the conflicts and '
                                     'merge the changes.</p>')
                    mtime = self.mtime()
                    self.set_raw_body(verynewtext, 1)
                else:
                   conflict_msg = _(conflict_msg + 
                                    'Your changes were sucessfully merged!')
                   mtime = self.mtime()
                   self.set_raw_body(verynewtext)

            if conflict_msg:
                self.request.write('<div id="message"><div>%s'
                                   '</div></div>'% conflict_msg)
                emit_anchor = 0 # make this msg visible!
        elif self.exists():
            # datestamp of existing page
            mtime = self.mtime()
        else:
            # page creation
            mtime = 0

        # output message
        message = kw.get('msg', '')
        if message:
            self.request.write('<div id="message">%s</div>' % (message))

        # get the text body for the editor field
        if form.has_key('template'):
            # "template" parameter contains the name of the template page
            template_page = wikiutil.unquoteWikiname(form['template'][0])
            raw_body = Page(template_page, self.request).get_raw_body()
        else:
            raw_body = self.get_raw_body()

        # send text above text area
        
        # button toolbar
        self.request.write('<div id="editArea">')
        self.request.write("<script type=\"text/javascript\">"
                           "var buttonRoot = '%s';</script>" % (
                            os.path.join(config.url_prefix,
                                         self.request.theme.name,
                                         'img', 'buttons')))
        if self.request.user.name:
          if config.user_page_prefix:
            self.request.write("<script type=\"text/javascript\">"
                               "var userPageLink = '[\"%s%s\"]';</script>" % (
                                config.user_page_prefix,
                                self.request.user.propercased_name))
          else: 
            self.request.write("<script type=\"text/javascript\">"
                               "var userPageLink = '[\"%s\"]';</script>" % (
                                config.user_page_prefix,
                                self.request.user.propercased_name))
        else:
          self.request.write("<script type=\"text/javascript\">"
                             "var userPageLink = '%s';</script>" % (
                             self.request.remote_addr))
          
        if config.wiki_farm:
            self.request.write("<script type=\"text/javascript\" "
                               "src=\"http://%s%s%s/edit.js\"></script>\n" % (
                                config.wiki_base_domain, config.web_dir,
                                config.url_prefix))
        else:
            self.request.write("<script type=\"text/javascript\" "
                               "src=\"%s%s/edit.js\"></script>\n" % (
                                config.web_dir, config.url_prefix))

        # send form
        self.request.write('<form name="editform" id="editform" '
                           'method="post" action="%s/%s#preview">' % (
                            self.request.getScriptname(),
                            wikiutil.quoteWikiname(proper_name)))

        self.request.write(str(html.INPUT(type="hidden", name="action",
                                          value="savepage")))
        if backto:
            self.request.write(str(html.INPUT(type="hidden",
                                              name="backto", value=backto)))

        # generate default content
        if not raw_body:
            if self.isTalkPage():
                raw_body = _('This page is for discussing the '
                             'contents of ["%s"].') % self.proper_name()[:-5]
            else:
                raw_body = _('Describe %s here.') % (self.proper_name(),)

        # replace CRLF with LF
        raw_body = self._normalize_text(raw_body)

        # send datestamp (version) of the page our edit is based on
        self.request.write('<input type="hidden" name="datestamp" '
                           'value="%s">' % repr(mtime))

        # Print the editor textarea and the save button
        self.request.write('<textarea id="savetext" name="savetext" '
                           'rows="%d" cols="%d" style="width:100%%;">%s'
                           '</textarea>' % (text_rows, text_cols,
                                            wikiutil.escape(raw_body)))

       # make sure we keep the template notice on a resize of the editor
        template_param = ''
        if form.has_key('template'):
            template_param = '&amp;template=' + form['template'][0]
       # draw edit size links
        self.request.write(_('<div class="pageEditInfo" id="editorSize">'
                             'editor size:'))
        self.request.write('<a href="#" onclick="return sizeEditor(\'bigger\','
                           '\'%s&amp;preview=1&amp;cols=60%s\')">%s'
                           '</a>' % (base_uri, template_param, '+'))
        self.request.write(',<a href="#" onclick="return sizeEditor(\'smaller\','
                           '\'%s&amp;preview=1&amp;cols=60%s\')">%s'
                           '</a>' % (base_uri, template_param, '-'))
        self.request.write('</div>')
        self.request.write('</p>') # close textarea

        self.request.write('<div id="editComment" id="editorResizeButtons"> '
                           '%s<br><input type="text" class="formfields" '
                           'name="comment" id="editorComment" value="%s" '
                           'size="%d" maxlength="80" style="width:99%%;">'
                           '</div>' % (_("<font size=\"+1\">Please comment "
                                         "about this change:</font>"),
                                       wikiutil.escape(kw.get('comment', ''),
                                       1), text_cols))

        spam_catch_button = (
            '<span style="position: absolute; top: 0px; left: 0px;'
                         'height: 0px; width: 0px; overflow: hidden;">'
            'dont enter into this box:'
            '<input type="text" name="text_dont"/>'
            '</span>'
            '<span style="position: absolute; top: 0px; left: 0px;'
                         'height: 0px; width: 0px; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont" '
                    'value="Dont press me">\n'
            '</span>')
        self.request.write(spam_catch_button)

        # button bar
        button_spellcheck = (SpellCheck and
            '<input type="submit" class="formbutton" name="button_spellcheck"'
            ' value="%s">' % _('Check Spelling')) or ''

        save_button_text = _('Save Changes')
        cancel_button_text = _('Cancel')
        
        self.request.write("</div>")

        if self.request.user.may.admin(self):
            security_button = ('<input type="button" class="formbutton" '
                              'onClick="location.href='
                              '\'%s/%s?action=Security\'" '
                              'value="Security">') % (
                                self.request.getScriptname(),
                                wikiutil.quoteWikiname(proper_name))
        else:
            security_button = ''
       
        if self.request.user.may.delete(self):
            delete_button = ('<input type="button" class="formbutton" '
                            'onClick="location.href='
                            '\'%s/%s?action=DeletePage\'" value="Delete">') % (
                                self.request.getScriptname(),
                                wikiutil.quoteWikiname(proper_name))
            rename_button = ('<input type="button" class="formbutton" '
                            'onClick="location.href=\'%s/%s?action=Rename\'"'
                            ' value="Rename">') % (
                                self.request.getScriptname(),
                                wikiutil.quoteWikiname(proper_name))
        else:
            delete_button = ''
            rename_button = ''
        
        self.request.write('<div id="editButtonRow">'
                           '<span>'
                           '<input type="submit" class="formbutton" '
                           'name="button_preview" value="%s"> '
                           '<input type="submit" class="formbutton" '
                           'name="button_save" value="%s"> '
                           '<input type="submit" class="formbutton" '
                           'name="button_cancel" value="%s"> '
                           '</span>'
                           '<span class="editActions">'
                           '<input type="button" class="formbutton" '
                           'onClick="window.open(\'%s/%s?action=Files\', '
                           '\'files\', \'width=800,height=600,'
                           'scrollbars=1\')" value="Upload Files"> '
                           '%s '
                           '%s '
                           '%s '
                           '%s</span>'
                           '</div>' % (
                                _('Preview'), save_button_text,
                                cancel_button_text,
                                self.request.getScriptname(),
                                wikiutil.quoteWikiname(proper_name),
                                button_spellcheck, delete_button,
                                rename_button, security_button))

        if self.request.config.edit_agreement_text:
            self.request.write(self.request.config.edit_agreement_text)

        badwords_re = None
        if preview is not None:
            if SpellCheck and (
                    form.has_key('button_spellcheck') or
                    form.has_key('button_newwords')):
                badwords, badwords_re, msg = SpellCheck.checkSpelling(self,
                    self.request, own_form=0)
                self.request.write("<p>%s</p>" % msg)
        self.request.write("</form>")

        if config.wiki_farm:
            from Sycamore import farm
            help_link = farm.link_to_page(farm.getBaseWikiName(),
                                          "Help with Editing",
                                          self.request.formatter,
                                          force_farm=True)
        else:
            help_link = Page("Help with Editing", self.request).link_to()

        # QuickHelp originally by Georg Mischler <*****@*****.**>
        self.request.write('<h2>Editing quick-help</h2>\n'
            '<dl><div style="float: right; margin: 10px; border: 1px solid; '
            'padding: 3pt;">See <b>%s</b> for more information.</div>' % (
                help_link) + _("<dt>Emphasis:</dt>\n"
                    "<dd>''<em>italics</em>''; '''<strong>bold</strong>''';"
                    "'''''<strong><em>bold italics</em></strong>''''';"
                    "''<em>mixed '''<strong>bold</strong>''' and "
                    "italics</em>''; ---- horizontal rule.</dd>"
                    "<dt>Headings:</dt>"
                    "<dd>= Title 1 =; == Title 2 ==; === Title 3 ===;"
                    "==== Title 4 ====; ===== Title 5 =====.</dd>"
                    "<dt>Lists:</dt>"
                    "<dd>space and one of * bullets; 1., a., A., i., I. "
                    "numbered items;"
                    "  1.#n start numbering at n; space alone indents.</dd>"
                    "<dt>Links:</dt>"
                    "<dd>[\"brackets and double quotes\"]; [\"the exact "
                    "page name\" label];"
                    "  url; [url]; [url label].</dd>"
                    "<dt>Tables:</dt>"
                    "<dd>|| cell text |||| cell text spanning two columns ||;"
                    "  no trailing white space allowed after tables or titles."
                    "</dd></dl>"))

        if preview is not None:
            if not emit_anchor:
                preview_name = "previewHide"
            else:
                preview_name = "preview"
            self.request.write('<div id="%s" class="preview">' % preview_name)
            self.send_page(content_only=1, hilite_re=badwords_re,
                           preview=preview)
            self.request.write('</div>')

        self.request.write('</div>\n') # end content div

        wikiutil.send_after_content(self.request)

        self.request.theme.emit_custom_html(config.page_footer1)
        self.request.theme.emit_custom_html(config.page_footer2)

        self.request.write('</body></html>') 
Example #16
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    macro.parser.inhibit_br += 2
    text = []
    if args:
        title = args
    else:
        title = "Comments:"
    if not macro.request.user.may.edit(macro.formatter.page):
        text.append("<h3>%s</h3>\n" "<p><strong>Note: You must be logged in to add " "comments</strong></p>\n" % title)
    else:
        text.append(
            "<h3>%(title)s</h3>\n"
            '<form method="POST" action="%(scriptname)s/%(q_pagename)s">\n'
            '<p><input type="hidden" name="action" value="comments">\n'
            '<textarea id="comment_text" name="comment_text_%(pghash)s" rows="1" '
            'style="width:100%%" '
            'onSelect="sizeTextField(this.id,event)" '
            'onPaste="sizeTextField(this.id,event)" '
            'onFocus="sizeTextField(this.id,event)" '
            'onKeyPress="sizeTextField(this.id,event)">'
            "</textarea>\n"
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
            'height: 0px!important; width: 0px!important; overflow: hidden;">'
            "dont enter into this box:"
            '<input type="text" name="comment_dont_%(pghash)s"/>'
            "</span>"
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
            'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont1_%(pghash)s" '
            'value="Add Comment (not! Do not press!)">\n'
            "</span>"
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
            'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont2_%(pghash)s" '
            'value="Add Comment (not! Do not press!)">\n'
            "</span>"
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
            'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont3_%(pghash)s" '
            'value="Add Comment (not! Do not press!)">\n'
            "</span>"
            '<input class="formbutton" type="submit" name="button_do_%(pghash)s" '
            'value="Add Comment">\n'
            '<i>Friendly reminder: Please read <a href="http://rocwiki.org/Wiki_Community/Etiquette" target="_blank">Wiki Community/Etiquette</a> before commenting.</i>'
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
            'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont4_%(pghash)s" '
            'value="Add Comment (not! Do not press!)">\n'
            "</span>"
            "</p>\n"
            "</form>"
            % {
                "title": title,
                "scriptname": macro.request.getScriptname(),
                "pghash": hash(macro.formatter.page.page_name.lower()),
                "q_pagename": wikiutil.quoteWikiname(macro.formatter.page.proper_name()),
            }
        )

    # we want to print a paragraph after the comments area if there's
    # anything following it
    macro.parser.force_print_p = True

    return formatter.rawHTML("".join(text))
Example #17
0
def execute(pagename, request):
    _ = request.getText
    actname = __name__.split('.')[-1]
    page = PageEditor(pagename, request)
    pagetext = page.get_raw_body()
    msg = ''

    # be extra paranoid in dangerous actions
    if (actname in config.excluded_actions or not request.user.may.edit(page)
            or not request.user.may.delete(page)):
        msg = _('You are not allowed to rename pages in this wiki!')

    # check whether page exists at all
    elif not page.exists():
        msg = _('This page is already deleted or was never created!')

    # check whether the user clicked the delete button
    elif (request.form.has_key('button')
          and request.form.has_key('newpagename')
          and request.form.has_key('ticket')):
        # check whether this is a valid renaming request (make outside
        # attacks harder by requiring two full HTTP transactions)
        if not _checkTicket(request.form['ticket'][0]):
            msg = _('Please use the interactive user '
                    'interface to rename pages!')
        else:
            renamecomment = request.form.get('comment', [''])[0]
            # strip to ensure naming consistency
            newpagename = request.form.get('newpagename')[0].strip()
            if newpagename == pagename:
                return Page(pagename, request).send_page(
                    msg="You can't rename a page to the name it already has!")
            try:
                newpage = PageEditor(newpagename, request)
            except Page.ExcessiveLength, msg:
                return Page(pagename, request).send_page(msg=msg)

            if len(renamecomment) > wikiaction.MAX_COMMENT_LENGTH:
                msg = _('Comments must be less than %s characters long.' %
                        wikiaction.MAX_COMMENT_LENGTH)
            elif len(newpagename) > MAX_PAGENAME_LENGTH:
                msg = _('Page names must be less than %s characters long.' %
                        MAX_PAGENAME_LENGTH)
            # check whether a page with the new name already exists
            elif (newpage.exists()
                  and not (newpagename.lower() == pagename.lower())):
                msg = _('A page with the name "%s" already exists!') % (
                    newpagename)

            elif not wikiaction.isValidPageName(newpagename):
                msg = _('Invalid pagename: Only the characters A-Z, a-z, 0-9, '
                        '"$", "&", ",", ".", "!", "\'", ":", ";", " ", "/", '
                        '"-", "(", ")" are allowed in page names.')

            # we actually do a rename!
            else:
                if renamecomment: renamecomment = " (" + renamecomment + ")"
                if newpagename.lower() != pagename.lower():
                    page.saveText("#redirect %s" % newpagename,
                                  '0',
                                  comment='Renamed to "%s"' % newpagename,
                                  action='RENAME',
                                  force_save=True)
                    # copy images over
                    copy_files(pagename, newpagename, request)

                newpage.saveText(pagetext,
                                 '0',
                                 comment='Renamed from "%s"%s' %
                                 (pagename, renamecomment),
                                 action="RENAME",
                                 proper_name=newpagename)

                msg = _('Page "%s" was successfully renamed to "%s"!') % (
                    pagename, newpagename)
                if newpagename.lower() != pagename.lower():
                    # check favorites because the redirect will
                    # process before the bookmarks get updated
                    if request.user.valid:
                        request.user.checkFavorites(page)

                    request.http_redirect(
                        '%s/%s?action=show&redirect=%s' %
                        (request.getScriptname(),
                         wikiutil.quoteWikiname(newpagename),
                         urllib.quote_plus(pagename.encode(config.charset),
                                           '')))

                    request.req_cache['pagenames'][(
                        newpagename.lower(),
                        request.config.wiki_name)] = newpagename
                    # we clear so the new page name appears
                    caching.CacheEntry(newpagename.lower(), request).clear()
                    return
                else:
                    request.req_cache['pagenames'][(
                        newpagename.lower(),
                        request.config.wiki_name)] = newpagename
                    # we clear so the new page name appears
                    caching.CacheEntry(newpagename.lower(), request).clear()
                    return newpage.send_page(msg)
Example #18
0
    def testUrl(self):
        """Test's Page.url()."""
        from Sycamore.Page import Page
        from Sycamore import farm
        list_of_wikis = self._get_list_of_wikis()

        # relative, w/o query string
        for trial in xrange(0, 200):
            pagename = make_random_string(MAX_PAGENAME_LENGTH)
            page = Page(pagename, self.request)
            pagename = page.proper_name()
            pagename_encoded = wikiutil.quoteWikiname(pagename)
            proper_url = '/%s' % pagename_encoded
            self.assertEqual(proper_url, page.url())

        # relative, w/ query string
        for trial in xrange(0, 200):
            pagename = make_random_string(MAX_PAGENAME_LENGTH)
            query = '?'
            the_range = random.randint(0, 10)
            for i in xrange(0, the_range):
                if i < (the_range-1): amperstand = '&'
                else: amperstand = ''
                query += ('%s=%s%s' %
                    (make_random_string(50, alphanum_only=True),
                     make_random_string(50, alphanum_only=True),
                     amperstand))
            page = Page(pagename, self.request)
            pagename = page.proper_name()
            pagename_encoded = wikiutil.quoteWikiname(pagename)
            proper_url = '/%s?%s' % (pagename_encoded, query)
            self.assertEqual(proper_url, page.url(querystr = query))

        original_wiki_name = self.request.config.wiki_name

        # absolute url, switched request
        for wiki_trial in xrange(0, 10):
            self.request.switch_wiki(random.choice(list_of_wikis))
            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(self.request.config.wiki_name,
                                           self.request)
                page = Page(pagename, self.request)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s' % (farm_url, pagename_encoded)
                self.assertEqual(proper_url, page.url(relative=False))

            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(self.request.config.wiki_name,
                                           self.request)
                query = '?'
                the_range = random.randint(0, 10)
                for i in xrange(0, the_range):
                    if i < (the_range-1):
                        amperstand = '&'
                    else:
                        amperstand = ''
                    query += ('%s=%s%s' %
                        (make_random_string(50, alphanum_only=True),
                         make_random_string(50, alphanum_only=True),
                         amperstand))
                page = Page(pagename, self.request)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s?%s' % (farm_url, pagename_encoded, query)
                self.assertEqual(proper_url,
                                 page.url(querystr=query, relative=False))

        self.request.switch_wiki(original_wiki_name)

        # absolute url, non-switched request
        for wiki_trial in xrange(0, 10):
            wiki_name = random.choice(list_of_wikis)
            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(wiki_name, self.request)
                page = Page(pagename, self.request, wiki_name=wiki_name)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s' % (farm_url, pagename_encoded)
                self.assertEqual(proper_url, page.url(relative=False))

            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(wiki_name, self.request)
                query = '?'
                the_range = random.randint(0, 10)
                for i in xrange(0, the_range):
                    if i < (the_range-1):
                        amperstand = '&'
                    else:
                        amperstand = ''
                    query += ('%s=%s%s' %
                        (make_random_string(50, alphanum_only=True),
                         make_random_string(50, alphanum_only=True),
                         amperstand))
                page = Page(pagename, self.request, wiki_name=wiki_name)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s?%s' % (farm_url, pagename_encoded, query)
                self.assertEqual(proper_url,
                                 page.url(querystr = query, relative=False))
Example #19
0
    def handleData(self, new_user=None):
        from Sycamore.Page import MAX_PAGENAME_LENGTH as MAX_USERNAME_LENGTH
        _ = self._
        form = self.request.form
        msg = ''
    
        isdisabled = False
        if form.get('disabled', [0])[0] == '1':
                isdisabled = True

        self.from_wiki = None
        if self.request.form.has_key('from_wiki'):
          self.from_wiki = self.request.form['from_wiki'][0].lower().strip()
          if not wikiutil.isInFarm(self.from_wiki, self.request):
            self.from_wiki = None

        new_user = int(form.get('new_user', [0])[0])
        # wiki farm authentication

        # we want them to be able to sign back in right after they
        # click the 'logout' GET link, hence this test
        is_form_logout = (form.has_key('qs') and 
                          urllib.unquote(form['qs'][0]) == 
                            'action=userform&logout=Logout')

        if (self.request.form.has_key('badlogin') and
            self.request.form['badlogin'][0]):
            _create_nologin_cookie(self.request)
            if config.wiki_farm:
                wiki_base_url = farm.getBaseFarmURL(self.request)
            else:
                wiki_base_url = '%s/' % self.request.getScriptname()
    
            return_string = ('Unknown username or wrong password.<br/><br/>'
                             'New user?  <a href="%s%s?new_user=1">Click here '
                             'to create an account!</a><br/><br/>'
                             'Forgot your password?  We\'ll email it to you.'
                             '<form action="%s" method="POST">'
                             '<input type="hidden" name="action" '
                                     'value="userform">'
                             'Email address: <input class="formfields" '
                                                    'type="text" name="email">'
                             '&nbsp;<input type="submit" class="formbutton" '
                                           'name="login_sendmail" '
                                           'value="Mail me my account data">'
                             '</form>' % (
                             wiki_base_url,
                             wikiutil.quoteWikiname(
                                config.page_user_preferences),
                             wiki_base_url))
            return return_string


        if (form.has_key('login_check') and form['login_check'][0] and
            form.has_key('backto_wiki') and form.has_key('backto_page')):
            backto_wiki = form['backto_wiki'][0]
            backto_page = form['backto_page'][0].encode(config.charset)
            if form.has_key('qs') and not is_form_logout:
                q_query_string = form['qs'][0]
            else:
                q_query_string = ''

            if self.request.user.valid:
                secret, stored_expire_time, session = \
                    self.request.user.cookie_dough
                if q_query_string:
                    url = ('%s?action=userform&backto_page=%s&qs=%s'
                           '&secret=%s&expire_time=%s&uid=%s&session=%s' % (
                            backto_page, urllib.quote(backto_page),
                            urllib.quote(q_query_string), urllib.quote(secret),
                            stored_expire_time, self.request.user.id,
                            urllib.quote(session)))
                else:
                     url = ('%s?action=userform&backto_page=%s&secret=%s'
                            '&expire_time=%s&uid=%s&session=%s' % (
                            backto_page, urllib.quote(backto_page),
                            urllib.quote(secret), stored_expire_time,
                            self.request.user.id, urllib.quote(session)))
            else:
                if q_query_string:
                    url = ('%s?action=userform&backto_page=%s&not_logged_in=1'
                           '&qs=%s' % (backto_page, urllib.quote(backto_page),
                                       urllib.quote(q_query_string)))
                else:
                     url = ('%s?action=userform&backto_page=%s&not_logged_in=1'
                            % (backto_page, urllib.quote(backto_page)))

            self.request.http_redirect(url) 
            return 

        # bounce-back wiki farm authentication
        if form.has_key('not_logged_in') and form.has_key('backto_page'):
            backto = urllib.unquote(form['backto_page'][0].encode(
                config.charset))
            if form.has_key('qs') and not is_form_logout:
                query_string = '?%s' % (urllib.unquote(form['qs'][0]
                                         ).encode(config.charset))
            else:
                query_string = ''
            url = '%s%s' % (backto, query_string)
            _create_nologin_cookie(self.request)
            self.request.http_redirect(url)
            return
        # bounce-back wiki farm authentication
        elif (form.has_key('uid') and form.has_key('secret') and
              form.has_key('session') and form.has_key('expire_time')):
            uid = form['uid'][0]
            secret = urllib.unquote(form['secret'][0])
            session = form['session'][0]
            expire_time = float(form['expire_time'][0])
            if form.has_key('backto_page'):
                backto_page = form['backto_page'][0]
            else:
                backto_page = '/' 
            if form.has_key('qs') and not is_form_logout:
                query_string = '?%s' % urllib.unquote(form['qs'][0])
            else:
                query_string = ''
            url = '%s%s' % (backto_page, query_string)
    
            self.request.http_redirect(url)
            self.request.user.sendCookie(self.request, expire=expire_time,
                                         sessionid=session, secret=secret,
                                         id=uid) 
            self.request.user.clearNologinCookie(self.request)
            return 

        if form.has_key('logout') or isdisabled:
            msg = ''
            if isdisabled:
                if not self.request.isPOST():
                    return "Use the interactive interface to change settings!"
                # disable the account
                self.request.user.disabled = 1
                # save user's profile
                self.request.user.save()
                msg = '<p>%s</p>' % _("Your account has been disabled.")

            # clear the cookie in the browser and locally
            try:
                cookie = Cookie.SimpleCookie(self.request.saved_cookie)
            except Cookie.CookieError:
                # ignore invalid cookies
                cookie = None
            else:
                if config.wiki_farm:
                    cookie_id = wikiutil.quoteCookiename(
                        config.wiki_base_domain + ',ID')
                else:
                    cookie_id = wikiutil.quoteCookiename(
                        config.sitename + ',ID')

                if cookie.has_key(cookie_id):
                    self.removeSession(cookie[cookie_id].value)
                    cookie_dir = config.web_dir
                    if not cookie_dir: cookie_dir = '/'
                    domain = wikiutil.getCookieDomain(self.request)
                    expirestr = time.strftime("%A, %d-%b-%Y %H:%M:%S GMT",
                                              time.gmtime(0))
                    self.request.setHttpHeader(('Set-Cookie',
                        ('%s="%s"; domain=%s; path=%s; '
                         'expires=%s' % (
                         (cookie_id, cookie[cookie_id].value,
                          domain, cookie_dir, expirestr)))))

            self.request.saved_cookie = ''
            self.request.auth_username = ''
            self.request.user = user.User(self.request)
            return msg + _("Cookie deleted. You are now logged out.")
    
        if form.has_key('login_sendmail'):
            if not self.request.isPOST():
                return "Use the interactive interface to change settings!"
            if not config.mail_smarthost:
                return _('This wiki is not enabled for mail processing. '
                        'Contact the owner of the wiki, who can either enable '
                        'email, or remove the "Subscribe" icon.')
            try:
                email = form['email'][0]
            except KeyError:
                return _("Please provide a valid email address!")
    
            text = ''
            uid = user.getUserIdByEmail(email, self.request)
            if uid:
                theuser = user.User(self.request, uid)
                if theuser.valid:
                    code = self.createCode(theuser.id)
                    sitename = farm.getBaseWikiFullName(self.request)
                    if config.wiki_farm:
                        url = farm.getBaseFarmURL(self.request)
                    else:
                        url = '%s/' % self.request.getBaseURL()
                    text = ("Go here to automatically log into %s: "
                            "%s%s?action=userform&uid=%s&code=%s\n"
                            "Once you're logged in, you should change your "
                            "password in your settings "
                            "(you forgot your password, right?).\n\n"
                            "(The link in this email is good for "
                            "one use only.)" % (
                            sitename, url,
                            wikiutil.quoteWikiname(
                                config.page_user_preferences),
                            theuser.id, code))

            if not text:
                return _("Found no account matching the given email address "
                         "'%(email)s'!") % {'email': email}


            mailok, msg = util.mail.sendmail(self.request, [email], 
                'Your wiki account data', text, mail_from=config.mail_from)
            return wikiutil.escape(msg)

        if form.has_key('login') or form.has_key('uid'):
            uid = None

            if form.has_key('code') and form.has_key('uid'):
               given_uid = form['uid'][0].strip()
               given_code = form['code'][0].strip()
        
               given_code
               if self.isValidCode(given_uid, given_code):
                  uid = given_uid

            if uid:
                # we were given account information so let's
                # create an account -> log them in
                theuser = user.User(self.request, id=uid)
                msg = _("You are now logged in!  "
                        "Please change your password below!")
                # send the cookie
                theuser.sendCookie(self.request)
                self.request.user = theuser
                return msg
            else:
                # we weren't given information, so let's see
                # if they gave us a login/password

                # try to get the user name
                try:
                    name = form['username'][0].replace('\t', ' ').strip()
                except KeyError:
                    name = ''

                # try to get the password
                password = form.get('password',[''])[0]

                # load the user data and check for validness
                if name:
                    theuser = user.User(self.request, name=name,
                                        password=password, is_login=True)
                else:
                    theuser = user.User(self.request, id=uid, name=name,
                                        password=password, is_login=True)

                if config.wiki_farm:
                    wiki_base_url = farm.getBaseFarmURL(self.request)
                else:
                    wiki_base_url = '%s/' % self.request.getScriptname()

                if not theuser.valid:
                    if (not self.request.form.has_key('backto_wiki') or not
                        self.request.form['backto_wiki'][0]):
                        return_string = ('Unknown username or wrong password.'
                                         '<br/><br/>New user?  '
                                         '<a href="%s%s?new_user=1">'
                                         'Click here to create an account!</a>'
                                         '<br/><br/>Forgot your password?  '
                                         'We\'ll email it to you.'
                                         '<form action="%s" method="POST">'
                                         '<input type="hidden" name="action" '
                                                 'value="userform">'
                                         'Email address: '
                                         '<input class="formfields" '
                                                 'type="text" name="email">'
                                         '&nbsp;'
                                         '<input type="submit" '
                                                 'class="formbutton" '
                                                 'name="login_sendmail" '
                                                 'value="Mail me my account '
                                                         'data">'
                                         '</form>' % (
                                         wiki_base_url,
                                         wikiutil.quoteWikiname(
                                            config.page_user_preferences),
                                         wiki_base_url))

                        return return_string
                    else:
                        self.request.http_redirect(
                            urllib.unquote(
                                self.request.form['backto_page'][0].encode(
                                    config.charset)) +
                            '?action=userform&badlogin=1')
                        return

            # send the cookie
            theuser.sendCookie(self.request)
            self.request.user = theuser
            send_back_home(self.request, msg="You are now logged in!")
        else:
            if not self.request.isPOST():
                return """Use the interactive interface to change settings!"""
            # save user's profile, first get user instance
            theuser = user.User(self.request)
    
            # try to get the name
            # if name is empty or missing, return an error msg
            if (form.has_key('username') and
                form['username'][0].replace('\t', '').strip()):
                theuser.propercased_name = \
                    form['username'][0].replace('\t', ' ').strip()
                theuser.name = theuser.propercased_name.lower()
            elif form.has_key('username'):
                raise BadData, (_("Please enter a user name!"), new_user)
    
            if (self.request.user.name and
                (self.request.user.name != theuser.name)):
              # they are still logged on and are trying to make a new account
              raise BadData, (_("Please log out before creating an account."),
                              new_user)
            if user.getUserId(theuser.name, self.request):
                if theuser.name != self.request.user.name:
                    raise BadData, (_("User name already exists!"), new_user)
                else:
                    new_user = False

            if form.has_key('save') and form['save'][0] == 'Change password':
                # change password setting 

                # try to get the password and pw repeat
                password = form.get('password', [''])[0]
                password2 = form.get('password2',[''])[0]

                # Check if password is given and matches with password repeat
                if password != password2:
                    raise BadData, (_("Passwords don't match!"), new_user)
                if not password and new_user:
                    raise BadData, (_("Please specify a password!"), new_user)
                if password:
                    theuser.enc_password = user.generate_hash(password)

                self._clear_all_sessions_except_current()

                msg = _("Password changed!")
            else:
                # process general settings

                # tr to get the email
                theuser.email = form.get('email', [''])[0]

                if theuser.email:
                    email_user_id = user.getUserIdByEmail(theuser.email,
                                                          self.request)
                else:
                    email_user_id = None
                if not theuser.email or not re.match(".+@.+\..{2,}",
                                                     theuser.email):
                    raise BadData, (_("Please provide your email address - "
                                      "without that you could not "
                                      "get your login data via email just in "
                                      "case you lose it."), new_user)
                elif email_user_id and email_user_id != theuser.id:
                    raise BadData, (_("Somebody else has already registered "
                                      "with the email address \"%s\", please "
                                      "pick something else." % theuser.email),
                                    new_user)
        
                # editor size
                theuser.edit_rows = util.web.getIntegerInput(self.request,
                    'edit_rows', theuser.edit_rows, 10, 60)
                theuser.edit_cols = util.web.getIntegerInput(self.request,
                    'edit_cols', theuser.edit_cols, 30, 100)
        
                # time zone
                tz = form.get('tz', theuser.tz)[0]
                if tz not in pytz.common_timezones:
                    tz = theuser.tz
                theuser.tz = tz
        
                wiki_for_userpage = form.get('wiki_for_userpage',
                                             [''])[0].lower()
                if (wiki_for_userpage and not
                    wikiutil.isInFarm(wiki_for_userpage, self.request)):
                    raise BadData, (_('"%s" is not the name of a wiki.' % (
                                      wiki_for_userpage)), new_user)
                if wiki_for_userpage != theuser.wiki_for_userpage:
                    # they have changed the wiki! time to do
                    # something differently
                    msg = _("<p>User preferences saved!</p>"
                            "<p><strong>Note:</strong> It may take a bit for "
                            "all links to your name to point to the "
                            "new wiki.</p>")
                    theuser.wiki_for_userpage = wiki_for_userpage

                # User CSS URL
                theuser.css_url = form.get('css_url', [''])[0]
        
                # try to get the (optional) preferred language
                #theuser.language = form.get('language', [''])[0]
    
                # checkbox options
                keys = []
                for key in user_checkbox_fields:
                    value = form.get(key, [0])[0]
                    try:
                        value = int(value)
                    except ValueError:
                        pass
                    setattr(theuser, key, value)
        
            if new_user:
                # strip spaces, we don't allow them anyway
                theuser.propercased_name = theuser.propercased_name.strip() 
                theuser.name = theuser.propercased_name.lower()
                if not theuser.name.strip():
                    raise BadData, (_("Please provide a user name!"), new_user)
                elif theuser.propercased_name.find(' ') != -1:
                    raise BadData, (_("Invalid username: spaces are not "
                                      "allowed in user names"), new_user)
                elif re.search('[%s]' % re.escape(USER_NOT_ALLOWED_CHARS),
                               theuser.propercased_name):
                    raise BadData, (_("Invalid username: the characters "
                                      "%s are not allowed in usernames." % (
                                      wikiutil.escape(
                                        USER_NOT_ALLOWED_CHARS))),
                                    new_user)
                # messes up subpages. 
                # '/' isn't allowed, so we just disallow this and we're cool.
                elif theuser.name == '..' or theuser.name == '.': 
                    raise BadData, (_("Invalid username: okay, seriously, "
                                      "that's a pretty lame name.  "
                                      "Pick something better!"), new_user)
                elif len(theuser.propercased_name) > MAX_USERNAME_LENGTH:
                    raise BadData, (_("Invalid username: a username can be "
                                      "at most %s characters long." % (
                                      MAX_USERNAME_LEGNTH)), new_user)
                elif (not theuser.email or not
                      re.match(".+@.+\..{2,}", theuser.email)):
                    raise BadData, (_("Please provide your email address - "
                                      "without that you could not get your " 
                                      "login data via email just in case you "
                                      "lose it."), new_user)
                name_exists = user.getUserId(theuser.name, self.request)
                if name_exists:
                    raise BadData, (_("This user name already belongs to "
                                      "somebody else."), new_user)
                email_exists = user.getUserIdByEmail(theuser.email,
                                                     self.request)
                if email_exists:
                    raise BadData, (_("This email already belongs to somebody "
                                      "else."), new_user)

                # try to get the password and pw repeat
                password = form.get('password', [''])[0]
                password2 = form.get('password2',[''])[0]

                # Check if password is given and matches with password repeat
                if password != password2:
                    raise BadData, (_("Passwords don't match!"), new_user)
                if not password and new_user:
                    raise BadData, (_("Please specify a password!"), new_user)
                if password:
                    theuser.enc_password = user.generate_hash(password)

                theuser.anonymous = False


            # save data and send cookie
            theuser.save(new_user=new_user)
            theuser.sendCookie(self.request)
            self.request.user = theuser
    

            from Sycamore.formatter.text_html import Formatter
            formatter = Formatter(self.request)

            if not new_user:
              if not msg:
                msg = _("User preferences saved!")
              if self.from_wiki:
                go_back_to_wiki = farm.link_to_wiki(self.from_wiki, formatter)
                msg = ('%s<br/><br/>Wanna go '
                       'back to %s?' % (msg, go_back_to_wiki))
            else:
              msg = _("Account created!  You are now logged in.")
              self.request.user.valid = 1
              if (self.from_wiki and self.from_wiki.lower() !=
                                     farm.getBaseWikiName()):
                go_back_to_wiki = farm.link_to_wiki(self.from_wiki, formatter)
                msg = ('%s<br/><br/>Head back over to %s and your new account '
                      'should work there!' % (msg, go_back_to_wiki))
            if _debug:
                msg = msg + util.dumpFormData(form)
            return msg
Example #20
0
    def asHTML(self):
        """
        Create the complete HTML form code.
        """
        _ = self._
        self.make_form()

        # different form elements depending on login state
        html_uid = ''
        html_sendmail = ''
        security_pagename = "%s/%s" % (config.wiki_settings_page,
            config.wiki_settings_page_security_defaults)
        if not self.request.user.name in wikiacl.Group("Admin", self.request):
            return ''
        else:
            self._inner.append(html.Raw('<div class="securitySettings">'))
            self.make_row(_("Everybody may:"), [
                html.INPUT(type="checkbox", name="All_may_read", value=1,
                    checked=self.request.config.acl_rights_default['All'][
                        ACL_RIGHTS_TABLE['read']]),
                'read', 
                html.INPUT(type="checkbox", name="All_may_edit", value=1,
                    checked=self.request.config.acl_rights_default['All'][
                        ACL_RIGHTS_TABLE['edit']]),
                'edit',
                html.INPUT(type="checkbox", name="All_may_delete", value=1,
                    checked=self.request.config.acl_rights_default['All'][
                        ACL_RIGHTS_TABLE['delete']]),
                'delete',
            ])

            self.make_row(_("Logged in people may:"), [
                html.INPUT(type="checkbox", name="Known_may_read", value=1,
                    checked=self.request.config.acl_rights_default['Known'][
                        ACL_RIGHTS_TABLE['read']]),
                'read', 
                html.INPUT(type="checkbox", name="Known_may_edit", value=1,
                    checked=self.request.config.acl_rights_default['Known'][
                        ACL_RIGHTS_TABLE['edit']]),
                'edit',
                html.INPUT(type="checkbox", name="Known_may_delete", value=1,
                    checked=self.request.config.acl_rights_default['Known'][
                        ACL_RIGHTS_TABLE['delete']]),
                'delete',
            ])

            self.make_row(_("Banned people may:"), [
                html.INPUT(type="checkbox", name="Banned_may_read", value=1,
                    checked=self.request.config.acl_rights_default['Banned'][
                        ACL_RIGHTS_TABLE['read']]),
                'read', 
                html.INPUT(type="checkbox", name="Banned_may_edit", value=1,
                    checked=self.request.config.acl_rights_default['Banned'][
                        ACL_RIGHTS_TABLE['edit']]),
                'edit',
                html.INPUT(type="checkbox", name="Banned_may_delete", value=1,
                    checked=self.request.config.acl_rights_default['Banned'][
                        ACL_RIGHTS_TABLE['delete']]),
                'delete',
            ])

            custom_groups = user.getGroupList(self.request,
                exclude_special_groups=True)
            for groupname in custom_groups:
                group = wikiacl.Group(groupname, self.request, fresh=True)
                self.make_row(_("People in the %s group may:" % (
                    wikiutil.escape(groupname))), [
                    html.INPUT(type="checkbox",
                        name="%s_may_read" % quoteWikiname(groupname),
                        value=1, checked=group.default_rights()[
                            ACL_RIGHTS_TABLE['read']]),
                    'read', 
                    html.INPUT(type="checkbox",
                        name="%s_may_edit" % quoteWikiname(groupname),
                        value=1, checked=group.default_rights()[
                            ACL_RIGHTS_TABLE['edit']]),
                    'edit',
                    html.INPUT(type="checkbox",
                        name="%s_may_delete" % quoteWikiname(groupname),
                        value=1, checked=group.default_rights()[
                            ACL_RIGHTS_TABLE['delete']]),
                    'delete',
                    html.INPUT(type="checkbox",
                        name="%s_may_admin" % quoteWikiname(groupname),
                        value=1, checked=group.default_rights()[
                            ACL_RIGHTS_TABLE['admin']]),
                    'change security' 
                ])
            
            self._inner.append(html.Raw("</div>")) # close securitySettings div
            buttons = [
                ('save', _('Save Settings')),
            ]

        # Add buttons
        button_cell = []
        for name, label in buttons:
            button_cell.extend([
                html.INPUT(type="submit", name=name, value=label),
                ' ',
            ])
        self.make_row('', button_cell)

        return str(self._form)
Example #21
0
def execute(pagename, request):
    _ = request.getText
    page = Page(pagename, request)
    actname = __name__.split('.')[-1] 
    if not request.user.may.admin(page):
        msg = _("You don't have admin permissions on this page, "
                "so you cannot change security settings.")
        return page.send_page(msg)
    
    if request.form.has_key('button'):
        # process save
        groups = [] 
        groups_dict = {}
        for key in request.form:
            if key.endswith('_groupname'):
                groups.append(unquoteWikiname(key[:-10]))
            else:
                if key.endswith('_may_read'):
                    dowhat = 'read'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_edit'):
                    dowhat = 'edit'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_delete'):
                    dowhat = 'delete'
                    groupname = unquoteWikiname(key[:-11])
                elif key.endswith('_may_admin'):
                    dowhat = 'admin'
                    groupname = unquoteWikiname(key[:-10])
                else:
                    continue

                if not groups_dict.has_key(groupname):
                    groups_dict[groupname] = [False, False, False, False]

                groups_dict[groupname][ACL_RIGHTS_TABLE[dowhat]] = True

        # set groups we weren't sent any checkboxes for to
        # all false (nothing checked)
        groups_no_checks = filter(lambda(groupname): (
            groupname not in groups_dict), groups)
        for groupname in groups_no_checks:
            groups_dict[groupname] = [False, False, False, False]
 
        wikiacl.setACL(pagename, groups_dict, request)
        return page.send_page(
            msg = _("Security settings sucessfully changed!"))

    formhtml = ['<h3>Security settings for "%s":</h3>' % pagename]

    button = _("Save")
    url = page.url()
    d = {'url': url, 'actname': actname, 'button': button}
    formhtml.append('<form method="POST" action="%(url)s">\n'
                    '<input type="hidden" name="action" value="%(actname)s">\n'
                    % d)

    custom_groups = user.getGroupList(request, exclude_special_groups=True)
    grouplist = ['All', 'Known'] + custom_groups
    for groupname in grouplist:
        # "All" and "Known" are a bit condense
        if groupname == 'All':
            written_groupname = 'Everybody'
        elif groupname == 'Known':
            written_groupname = 'Logged in people'
        else:
            written_groupname = groupname

        group = wikiacl.Group(groupname, request, fresh=True)

        # we want to show the 'change security' option only if
        # it makes some sense
        show_admin = groupname in custom_groups

        formhtml.append('<h6>%s</h6>' % written_groupname)
        formhtml.append('<input type="hidden" name="%s_groupname" '
                                  'value="1">' % quoteWikiname(groupname))
        if group.may(page, 'read'):
            formhtml.append('<input type="checkbox" checked '
                                    'name="%s_may_read" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_read" '
                                   'value="1">' % quoteWikiname(groupname))
        formhtml.append(' read ')

        if group.may(page, 'edit'):
            formhtml.append('<input type="checkbox" checked '
                                   'name="%s_may_edit" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_edit" '
                                   'value="1">' % quoteWikiname(groupname))
        formhtml.append(' edit ') 

        if group.may(page, 'delete'):
            formhtml.append('<input type="checkbox" checked '
                                   'name="%s_may_delete" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_delete" '
                                   'value="1">' % quoteWikiname(groupname))
        formhtml.append(' delete ')

        if show_admin:
            if group.may(page, 'admin'):
                formhtml.append('<input type="checkbox" checked '
                                       'name="%s_may_admin" value="1">' %
                                quoteWikiname(groupname))
            else:
                formhtml.append('<input type="checkbox" name="%s_may_admin" '
                                       'value="1">' % quoteWikiname(groupname))
            formhtml.append(' change security ')

    formhtml.append(
        '<p><input type="submit" name="button" value="%(button)s">\n'
        '</p>\n'
        '</form>' % d)

    page.send_page(msg=''.join(formhtml))
Example #22
0
def execute(pagename, request):
    _ = request.getText
    page = Page(pagename, request)
    actname = __name__.split('.')[-1]
    if not request.user.may.admin(page):
        msg = _("You don't have admin permissions on this page, "
                "so you cannot change security settings.")
        return page.send_page(msg)

    if request.form.has_key('button'):
        # process save
        groups = []
        groups_dict = {}
        for key in request.form:
            if key.endswith('_groupname'):
                groups.append(unquoteWikiname(key[:-10]))
            else:
                if key.endswith('_may_read'):
                    dowhat = 'read'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_edit'):
                    dowhat = 'edit'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_delete'):
                    dowhat = 'delete'
                    groupname = unquoteWikiname(key[:-11])
                elif key.endswith('_may_admin'):
                    dowhat = 'admin'
                    groupname = unquoteWikiname(key[:-10])
                else:
                    continue

                if not groups_dict.has_key(groupname):
                    groups_dict[groupname] = [False, False, False, False]

                groups_dict[groupname][ACL_RIGHTS_TABLE[dowhat]] = True

        # set groups we weren't sent any checkboxes for to
        # all false (nothing checked)
        groups_no_checks = filter(
            lambda (groupname): (groupname not in groups_dict), groups)
        for groupname in groups_no_checks:
            groups_dict[groupname] = [False, False, False, False]

        wikiacl.setACL(pagename, groups_dict, request)
        return page.send_page(msg=_("Security settings sucessfully changed!"))

    formhtml = ['<h3>Security settings for "%s":</h3>' % pagename]

    button = _("Save")
    url = page.url()
    d = {'url': url, 'actname': actname, 'button': button}
    formhtml.append(
        '<form method="POST" action="%(url)s">\n'
        '<input type="hidden" name="action" value="%(actname)s">\n' % d)

    custom_groups = user.getGroupList(request, exclude_special_groups=True)
    grouplist = ['All', 'Known'] + custom_groups
    for groupname in grouplist:
        # "All" and "Known" are a bit condense
        if groupname == 'All':
            written_groupname = 'Everybody'
        elif groupname == 'Known':
            written_groupname = 'Logged in people'
        else:
            written_groupname = groupname

        group = wikiacl.Group(groupname, request, fresh=True)

        # we want to show the 'change security' option only if
        # it makes some sense
        show_admin = groupname in custom_groups

        formhtml.append('<h6>%s</h6>' % written_groupname)
        formhtml.append('<input type="hidden" name="%s_groupname" '
                        'value="1">' % quoteWikiname(groupname))
        if group.may(page, 'read'):
            formhtml.append('<input type="checkbox" checked '
                            'name="%s_may_read" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_read" '
                            'value="1">' % quoteWikiname(groupname))
        formhtml.append(' read ')

        if group.may(page, 'edit'):
            formhtml.append('<input type="checkbox" checked '
                            'name="%s_may_edit" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_edit" '
                            'value="1">' % quoteWikiname(groupname))
        formhtml.append(' edit ')

        if group.may(page, 'delete'):
            formhtml.append('<input type="checkbox" checked '
                            'name="%s_may_delete" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_delete" '
                            'value="1">' % quoteWikiname(groupname))
        formhtml.append(' delete ')

        if show_admin:
            if group.may(page, 'admin'):
                formhtml.append('<input type="checkbox" checked '
                                'name="%s_may_admin" value="1">' %
                                quoteWikiname(groupname))
            else:
                formhtml.append('<input type="checkbox" name="%s_may_admin" '
                                'value="1">' % quoteWikiname(groupname))
            formhtml.append(' change security ')

    formhtml.append(
        '<p><input type="submit" name="button" value="%(button)s">\n'
        '</p>\n'
        '</form>' % d)

    page.send_page(msg=''.join(formhtml))
Example #23
0
def add_event_form_box(htmltext, macro):
    event_timezone = macro.request.config.tz

    current_time = macro.request.user.getFormattedDateTime(time.time())
    year_cut = string.split(current_time, " ")[0]
    current_year = string.split(year_cut, "-")[0]
    month_cut = string.split(current_time, " ")[0]
    current_month = string.split(month_cut, "-")[1]
    day_cut = string.split(current_time, " ")[0]
    current_day = string.split(day_cut, "-")[2]
    hour_cut = string.split(current_time, " ")[1]
    current_hour = string.split(hour_cut, ":")[0]
    minute_cut = string.split(current_time, " ")[1]
    current_minute = string.split(minute_cut, ":")[1]

    title = "Post a new event:"
    htmltext.append(
        "<h3>%s</h3>\n"
        '<table border="0" cellspacing="0" cellpadding="3">\n'
        '<tr><td><form method="POST" action="%s/%s">\n'
        '<input type="hidden" name="action" value="events">\n'
        '<input type="hidden" name="ticket" value="%s">\n'
        'Event name: <input class="formfields" type="text" name="event_name"'
        'size="30" maxlength="100">&nbsp;\n'
        'Location: <input class="formfields" type="text" '
        'name="event_location" size="25" maxlength="100">'
        "<br><br>\n"
        % (
            title,
            macro.request.getScriptname(),
            wikiutil.quoteWikiname(macro.formatter.page.proper_name()),
            createTicket(),
        )
    )

    monthstring = (
        '<p>Date: <select name="month">\n'
        '<option value="1">January</option>\n'
        '<option value="2">February</option>\n'
        '<option value="3">March</option>\n'
        '<option value="4">April</option>\n'
        '<option value="5">May</option>\n'
        '<option value="6">June</option>\n'
        '<option value="7">July</option>\n '
        '<option value="8">August</option>\n'
        '<option value="9">September</option>\n'
        '<option value="10">October</option>\n'
        '<option value="11">November</option>\n'
        '<option value="12">December</option>\n</select>\n'
    )
    newmonthstring = monthstring.replace(
        'value="%s"' % str(int(current_month)), 'value="%s" selected' % str(int(current_month))
    )
    htmltext.append(newmonthstring)

    daystring = (
        '<select name="day">\n '
        "<option>1</option>\n "
        "<option>2</option>\n "
        "<option>3</option>\n "
        "<option>4</option>\n "
        "<option>5</option>\n "
        "<option>6</option>\n "
        "<option>7</option>\n "
        "<option>8</option>\n "
        "<option>9</option>\n "
        "<option>10</option>\n "
        "<option>11</option>\n "
        "<option>12</option>\n "
        "<option>13</option>\n "
        "<option>14</option>\n "
        "<option>15</option>\n "
        "<option>16</option>\n "
        "<option>17</option>\n "
        "<option>18</option>\n "
        "<option>19</option>\n "
        "<option>20</option>\n "
        "<option>21</option>\n "
        "<option>22</option>\n "
        "<option>23</option>\n "
        "<option>24</option>\n "
        "<option>25</option>\n "
        "<option>26</option>\n "
        "<option>27</option>\n "
        "<option>28</option>\n "
        "<option>29</option>\n "
        "<option>30</option>\n "
        "<option>31</option>\n "
        "</select>\n"
    )
    newdaystring = daystring.replace(">" + str(int(current_day)) + "<", " selected>" + str(int(current_day)) + "<")
    htmltext.append(newdaystring)

    yearstring = '<select name="year">\n'
    for year in yearList():
        yearstring += "<option>%s</option>\n" % year
    yearstring += "</select>"
    newyearstring = yearstring.replace(">" + current_year + "<", " selected>" + current_year + "<")
    htmltext.append(newyearstring)

    hourstring = (
        'Time: <select name="hour">\n '
        '<option value="0">12AM</option>\n '
        '<option value="1">1AM</option>\n '
        '<option value="2">2AM</option>\n '
        '<option value="3">3AM</option>\n '
        '<option value="4">4AM</option>\n '
        '<option value="5">5AM</option>\n '
        '<option value="6">6AM</option>\n '
        '<option value="7">7AM</option>\n '
        '<option value="8">8AM</option>\n '
        '<option value="9">9AM</option>\n '
        '<option value="10">10AM</option>\n '
        '<option value="11">11AM</option>\n '
        '<option value="12">12PM</option>\n '
        '<option value="13">1PM</option>\n '
        '<option value="14">2PM</option>\n '
        '<option value="15">3PM</option>\n '
        '<option value="16">4PM</option>\n '
        '<option value="17">5PM</option>\n '
        '<option value="18">6PM</option>\n '
        '<option value="19">7PM</option>\n '
        '<option value="20">8PM</option>\n '
        '<option value="21">9PM</option>\n '
        '<option value="22">10PM</option>\n '
        '<option value="23">11PM</option>\n '
        "</select>\n"
    )
    newhourstring = hourstring.replace(
        'value="%s"' % str(int(current_hour)), 'value="%s" selected' % str(int(current_hour))
    )
    htmltext.append(newhourstring)

    rounded_min = (int(current_minute) / 15 + 1) * 15
    if rounded_min is 60:
        rounded_min = 0

    rounded_min = str(rounded_min)

    minutestring = (
        ' : <select name="minute">\n '
        '<option value="0">00</option>\n '
        '<option value="15">15</option>\n '
        '<option value="30">30</option>\n '
        '<option value="45">45</option>\n '
        "</select> (in %s)</p>\n" % event_timezone
    )
    newminutestring = minutestring.replace('value="%s"' % rounded_min, 'value="%s" selected' % rounded_min)
    htmltext.append(newminutestring)

    htmltext.append(
        "<p>Describe event:</p>"
        '<textarea name="event_text" rows="5" cols="67" wrapping=yes>'
        "</textarea><br>\n"
        '<input class="formbutton" type="submit" name="button" '
        'value="Add Event">\n'
        "</form></td></tr></table>"
    )
Example #24
0
    def sendEditor(self, **kw):
        """
        Send the editor form page.

        @keyword preview: if given, show this text in preview mode
        @keyword staytop: don't go to #preview
        @keyword comment: comment field (when preview is true)
        @keyword had_conflict: we had an edit conflict on a save.
        """
        import re

        try:
            from Sycamore.action import SpellCheck
        except ImportError:
            SpellCheck = None

        form = self.request.form
        _ = self._
        self.request.http_headers([("Content-Type", "text/html; charset=%s" %
                                    config.charset)] + self.request.nocache)
        msg = None
        preview = kw.get('preview', None)
        emit_anchor = not kw.get('staytop', 0)
        proper_name = self.proper_name()

        from Sycamore.formatter.text_html import Formatter
        self.request.formatter = Formatter(self.request,
                                           store_pagelinks=1,
                                           preview=preview)

        base_uri = "%s/%s?action=edit" % (self.request.getScriptname(),
                                          wikiutil.quoteWikiname(
                                              self.proper_name()))
        backto = form.get('backto', [None])[0]
        if backto:
            base_uri += '&amp;' + util.web.makeQueryString(backto=backto)

        # check edit permissions
        if not self.request.user.may.edit(self):
            msg = _('You are not allowed to edit this page.')
        elif self.prev_date:
            # Trying to edit an old version, this is not possible via
            # the web interface, but catch it just in case...
            msg = _('Cannot edit old revisions!')

        # Did one of the prechecks fail?
        if msg and not kw.get('had_conflict', None):
            self.send_page(msg=msg)
            return

        # check for preview submit
        if preview is None:
            title = _('Edit "%(pagename)s"')
        else:
            title = _('Preview of "%(pagename)s"')
            self.set_raw_body(preview.replace("\r", ""), 1)

        page_needle = self.page_name
        if config.allow_subpages and page_needle.count('/'):
            page_needle = '/' + page_needle.split('/')[-1]

        wikiutil.send_title(
            self.request,
            self.proper_name(),
            pagename=self.proper_name(),
            has_link=True,
            strict_title='Editing "%s"' % self.proper_name(),
            body_onload="sizeForIE('savetext', 100, 'editorComment', 99);")

        # start content div
        self.request.write('<div id="content" class="content">\n')

        # get request parameters
        text_rows = None
        if form.has_key('rows'):
            text_rows = int(form['rows'][0])
            if self.request.user.valid:
                # possibly update user's pref
                if text_rows != self.request.user.edit_rows:
                    self.request.user.edit_rows = text_rows
                    self.request.user.save()
        else:
            text_rows = config.edit_rows
            if self.request.user.valid:
                text_rows = int(self.request.user.edit_rows)

        if form.has_key('cols'):
            text_cols = int(form['cols'][0])
            if self.request.user.valid:
                # possibly update user's pref
                if text_rows != self.request.user.edit_rows:
                    self.request.user.edit_rows = text_rows
                    self.request.user.save()
        else:
            text_cols = 80
            if self.request.user.valid:
                text_cols = int(self.request.user.edit_cols)

        # check datestamp (version) of the page our edit is based on
        if preview is not None:
            # propagate original datestamp
            mtime = float(form['datestamp'][0])

            # did someone else change the page while we were editing?
            conflict_msg = None
            if not self.exists():
                # page does not exist, are we creating it?
                if mtime:
                    conflict_msg = _('<p>Someone else <b>deleted</b> this '
                                     'page while you were editing!')
            elif mtime != self.mtime():
                conflict_msg = _('<p>Someone else changed this page while '
                                 'you were editing.')
                # merge conflicting versions
                allow_conflicts = 1
                from Sycamore.util import diff3
                savetext = self.get_raw_body()
                oldpg = Page(self.page_name, self.request, prev_date=mtime)
                original_text = oldpg.get_raw_body()
                saved_text = Page(self.page_name, self.request).get_raw_body()
                verynewtext, had_conflict = diff3.text_merge(
                    original_text,
                    saved_text,
                    savetext,
                    marker1='----- /!\ Edit conflict! Your version: -----\n',
                    marker2='----- /!\ Edit conflict! Other version: -----\n',
                    marker3='----- /!\ End of edit conflict -----\n')
                if had_conflict and self.request.user.valid and (
                        self.request.user.id == self.last_edit_info()[1]):
                    # user pressed back button or did something weird
                    conflict_msg = None
                elif had_conflict:
                    conflict_msg = _(conflict_msg +
                                     'There was an <b>edit conflict between '
                                     'your changes!</b></p>'
                                     '<p>Please review the conflicts and '
                                     'merge the changes.</p>')
                    mtime = self.mtime()
                    self.set_raw_body(verynewtext, 1)
                else:
                    conflict_msg = _(conflict_msg +
                                     'Your changes were sucessfully merged!')
                    mtime = self.mtime()
                    self.set_raw_body(verynewtext)

            if conflict_msg:
                self.request.write('<div id="message"><div>%s'
                                   '</div></div>' % conflict_msg)
                emit_anchor = 0  # make this msg visible!
        elif self.exists():
            # datestamp of existing page
            mtime = self.mtime()
        else:
            # page creation
            mtime = 0

        # output message
        message = kw.get('msg', '')
        if message:
            self.request.write('<div id="message">%s</div>' % (message))

        # get the text body for the editor field
        if form.has_key('template'):
            # "template" parameter contains the name of the template page
            template_page = wikiutil.unquoteWikiname(form['template'][0])
            raw_body = Page(template_page, self.request).get_raw_body()
        else:
            raw_body = self.get_raw_body()

        # send text above text area

        # button toolbar
        self.request.write('<div id="editArea">')
        self.request.write(
            "<script type=\"text/javascript\">"
            "var buttonRoot = '%s';</script>" % (os.path.join(
                config.url_prefix, self.request.theme.name, 'img', 'buttons')))
        if self.request.user.name:
            if config.user_page_prefix:
                self.request.write(
                    "<script type=\"text/javascript\">"
                    "var userPageLink = '[\"%s%s\"]';</script>" %
                    (config.user_page_prefix,
                     self.request.user.propercased_name))
            else:
                self.request.write("<script type=\"text/javascript\">"
                                   "var userPageLink = '[\"%s\"]';</script>" %
                                   (config.user_page_prefix,
                                    self.request.user.propercased_name))
        else:
            self.request.write("<script type=\"text/javascript\">"
                               "var userPageLink = '%s';</script>" %
                               (self.request.remote_addr))

        if config.wiki_farm:
            self.request.write(
                "<script type=\"text/javascript\" "
                "src=\"http://%s%s%s/edit.js\"></script>\n" %
                (config.wiki_base_domain, config.web_dir, config.url_prefix))
        else:
            self.request.write("<script type=\"text/javascript\" "
                               "src=\"%s%s/edit.js\"></script>\n" %
                               (config.web_dir, config.url_prefix))

        # send form
        self.request.write('<form name="editform" id="editform" '
                           'method="post" action="%s/%s#preview">' %
                           (self.request.getScriptname(),
                            wikiutil.quoteWikiname(proper_name)))

        self.request.write(
            str(html.INPUT(type="hidden", name="action", value="savepage")))
        if backto:
            self.request.write(
                str(html.INPUT(type="hidden", name="backto", value=backto)))

        # generate default content
        if not raw_body:
            if self.isTalkPage():
                raw_body = _('This page is for discussing the '
                             'contents of ["%s"].') % self.proper_name()[:-5]
            else:
                raw_body = _('Describe %s here.') % (self.proper_name(), )

        # replace CRLF with LF
        raw_body = self._normalize_text(raw_body)

        # send datestamp (version) of the page our edit is based on
        self.request.write('<input type="hidden" name="datestamp" '
                           'value="%s">' % repr(mtime))

        # Print the editor textarea and the save button
        self.request.write('<textarea id="savetext" name="savetext" '
                           'rows="%d" cols="%d" style="width:100%%;">%s'
                           '</textarea>' %
                           (text_rows, text_cols, wikiutil.escape(raw_body)))

        # make sure we keep the template notice on a resize of the editor
        template_param = ''
        if form.has_key('template'):
            template_param = '&amp;template=' + form['template'][0]

    # draw edit size links
        self.request.write(
            _('<div class="pageEditInfo" id="editorSize">'
              'editor size:'))
        self.request.write('<a href="#" onclick="return sizeEditor(\'bigger\','
                           '\'%s&amp;preview=1&amp;cols=60%s\')">%s'
                           '</a>' % (base_uri, template_param, '+'))
        self.request.write(
            ',<a href="#" onclick="return sizeEditor(\'smaller\','
            '\'%s&amp;preview=1&amp;cols=60%s\')">%s'
            '</a>' % (base_uri, template_param, '-'))
        self.request.write('</div>')
        self.request.write('</p>')  # close textarea

        self.request.write(
            '<div id="editComment" id="editorResizeButtons"> '
            '%s<br><input type="text" class="formfields" '
            'name="comment" id="editorComment" value="%s" '
            'size="%d" maxlength="80" style="width:99%%;">'
            '</div>' % (_("<font size=\"+1\">Please comment "
                          "about this change:</font>"),
                        wikiutil.escape(kw.get('comment', ''), 1), text_cols))

        spam_catch_button = (
            '<span style="position: absolute; top: 0px; left: 0px;'
            'height: 0px; width: 0px; overflow: hidden;">'
            'dont enter into this box:'
            '<input type="text" name="text_dont"/>'
            '</span>'
            '<span style="position: absolute; top: 0px; left: 0px;'
            'height: 0px; width: 0px; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont" '
            'value="Dont press me">\n'
            '</span>')
        self.request.write(spam_catch_button)

        # button bar
        button_spellcheck = (
            SpellCheck and
            '<input type="submit" class="formbutton" name="button_spellcheck"'
            ' value="%s">' % _('Check Spelling')) or ''

        save_button_text = _('Save Changes')
        cancel_button_text = _('Cancel')

        self.request.write("</div>")

        if self.request.user.may.admin(self):
            security_button = ('<input type="button" class="formbutton" '
                               'onClick="location.href='
                               '\'%s/%s?action=Security\'" '
                               'value="Security">') % (
                                   self.request.getScriptname(),
                                   wikiutil.quoteWikiname(proper_name))
        else:
            security_button = ''

        if self.request.user.may.delete(self):
            delete_button = ('<input type="button" class="formbutton" '
                             'onClick="location.href='
                             '\'%s/%s?action=DeletePage\'" value="Delete">'
                             ) % (self.request.getScriptname(),
                                  wikiutil.quoteWikiname(proper_name))
            rename_button = ('<input type="button" class="formbutton" '
                             'onClick="location.href=\'%s/%s?action=Rename\'"'
                             ' value="Rename">') % (self.request.getScriptname(
                             ), wikiutil.quoteWikiname(proper_name))
        else:
            delete_button = ''
            rename_button = ''

        self.request.write(
            '<div id="editButtonRow">'
            '<span>'
            '<input type="submit" class="formbutton" '
            'name="button_preview" value="%s"> '
            '<input type="submit" class="formbutton" '
            'name="button_save" value="%s"> '
            '<input type="submit" class="formbutton" '
            'name="button_cancel" value="%s"> '
            '</span>'
            '<span class="editActions">'
            '<input type="button" class="formbutton" '
            'onClick="window.open(\'%s/%s?action=Files\', '
            '\'files\', \'width=800,height=600,'
            'scrollbars=1\')" value="Upload Files"> '
            '%s '
            '%s '
            '%s '
            '%s</span>'
            '</div>' %
            (_('Preview'), save_button_text, cancel_button_text,
             self.request.getScriptname(), wikiutil.quoteWikiname(proper_name),
             button_spellcheck, delete_button, rename_button, security_button))

        if self.request.config.edit_agreement_text:
            self.request.write(self.request.config.edit_agreement_text)

        badwords_re = None
        if preview is not None:
            if SpellCheck and (form.has_key('button_spellcheck')
                               or form.has_key('button_newwords')):
                badwords, badwords_re, msg = SpellCheck.checkSpelling(
                    self, self.request, own_form=0)
                self.request.write("<p>%s</p>" % msg)
        self.request.write("</form>")

        if config.wiki_farm:
            from Sycamore import farm
            help_link = farm.link_to_page(farm.getBaseWikiName(),
                                          "Help with Editing",
                                          self.request.formatter,
                                          force_farm=True)
        else:
            help_link = Page("Help with Editing", self.request).link_to()

        # QuickHelp originally by Georg Mischler <*****@*****.**>
        self.request.write(
            '<h2>Editing quick-help</h2>\n'
            '<dl><div style="float: right; margin: 10px; border: 1px solid; '
            'padding: 3pt;">See <b>%s</b> for more information.</div>' %
            (help_link) +
            _("<dt>Emphasis:</dt>\n"
              "<dd>''<em>italics</em>''; '''<strong>bold</strong>''';"
              "'''''<strong><em>bold italics</em></strong>''''';"
              "''<em>mixed '''<strong>bold</strong>''' and "
              "italics</em>''; ---- horizontal rule.</dd>"
              "<dt>Headings:</dt>"
              "<dd>= Title 1 =; == Title 2 ==; === Title 3 ===;"
              "==== Title 4 ====; ===== Title 5 =====.</dd>"
              "<dt>Lists:</dt>"
              "<dd>space and one of * bullets; 1., a., A., i., I. "
              "numbered items;"
              "  1.#n start numbering at n; space alone indents.</dd>"
              "<dt>Links:</dt>"
              "<dd>[\"brackets and double quotes\"]; [\"the exact "
              "page name\" label];"
              "  url; [url]; [url label].</dd>"
              "<dt>Tables:</dt>"
              "<dd>|| cell text |||| cell text spanning two columns ||;"
              "  no trailing white space allowed after tables or titles."
              "</dd></dl>"))

        if preview is not None:
            if not emit_anchor:
                preview_name = "previewHide"
            else:
                preview_name = "preview"
            self.request.write('<div id="%s" class="preview">' % preview_name)
            self.send_page(content_only=1,
                           hilite_re=badwords_re,
                           preview=preview)
            self.request.write('</div>')

        self.request.write('</div>\n')  # end content div

        wikiutil.send_after_content(self.request)

        self.request.theme.emit_custom_html(config.page_footer1)
        self.request.theme.emit_custom_html(config.page_footer2)

        self.request.write('</body></html>')
Example #25
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    if line_has_just_macro(macro, args, formatter):
      macro.parser.inhibit_br = 2

    macro_text = ''

    baseurl = macro.request.getScriptname()
    action = 'Files' # name of the action that does the file stuff
    html = []
    ticketString = None # for temporary thumbnail generation
    pagename = formatter.page.page_name
    urlpagename = wikiutil.quoteWikiname(formatter.page.proper_name())

    if not args:
        macro_text += formatter.rawHTML(
            '<b>Please supply at least an image name, e.g. '
            '[[Image(image.jpg)]], where image.jpg is an image that\'s been '
            'uploaded to this page.</b>')
	return macro_text

    # image.jpg, "caption, here, yes", 20, right --- in any order
    # (filename first)
    # the number is the 'max' size (width or height) in pixels

    # parse the arguments
    try:
        (image_name, caption, thumbnail, px_size, alignment,
         border) = getArguments(args)
    except:
        macro_text += formatter.rawHTML('[[Image(%s)]]' % wikiutil.escape(args))
        return macro_text

    if not wikiutil.isImage(image_name):
        macro_text += "%s does not seem to be an image file." % image_name
        return macro_text

    url_image_name = urllib.quote(image_name.encode(config.charset))

    if (macro.formatter.processed_thumbnails.has_key(
            (pagename, image_name)) and
        (thumbnail or caption)):
        macro_text += ('<em style="background-color: #ffffaa; padding: 2px;">'
                       'A thumbnail or caption may be displayed only once per '
                       'image.</em>')
        return macro_text

    macro.formatter.processed_thumbnails[(pagename, image_name)] = True
    
    #is the original image even on the page?
    macro.request.cursor.execute("""SELECT name
                                    FROM files
                                    WHERE name=%(image_name)s and
                                    attached_to_pagename=%(pagename)s and
                                    wiki_id=%(wiki_id)s""",
                                 {'image_name':image_name,
                                  'pagename':pagename.lower(),
                                  'wiki_id':macro.request.config.wiki_id})
    result = macro.request.cursor.fetchone()
    image_exists = result

    if not image_exists:
        # lets make a link telling them they can upload the image,
        # just like the normal attachment
        linktext = 'Upload new image "%s"' % (image_name)
        macro_text += wikiutil.attach_link_tag(macro.request,
                  '%s?action=Files&amp;rename=%s#uploadFileArea' % (
                      wikiutil.quoteWikiname(formatter.page.proper_name()),
                      url_image_name),
                  linktext)
        return macro_text

    full_size_url = (baseurl + "/" + urlpagename + "?action=" + action +
                     "&amp;do=view&amp;target=" + url_image_name)
    # put the caption in the db if it's new and if we're not in preview mode
    if not formatter.isPreview():
        touchCaption(pagename, pagename, image_name, caption, macro.request)
    if caption:
        # parse the caption string
        caption = wikiutil.stripOuterParagraph(wikiutil.wikifyString(
            caption, formatter.request, formatter.page, formatter=formatter))

    if thumbnail:
        # let's generated the thumbnail or get the dimensions if it's
        # already been generated
        if not px_size:
            px_size = default_px_size
        (x, y), ticketString = touchThumbnail(macro.request, pagename,
                                              image_name, px_size, formatter)

        d = {'right':'floatRight', 'left':'floatLeft', '':'noFloat'}
        floatSide = d[alignment]
        if caption and border:
            html.append('<span class="%s thumb" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '<span>%s</span>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name, caption))
        elif border:
            html.append('<span class="%s thumb" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name))
        elif caption and not border:
            html.append('<span class="%s thumb noborder" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '<span>%s</span></span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name, caption))
        else:
            html.append('<span class="%s thumb noborder" style="width: %spx;">'
                        '<a style="color: black;" href="%s">'
                        '<img src="%s" alt="%s" style="display:block;"/></a>'
                        '</span>' %
                        (floatSide, int(x)+2, full_size_url,
                         Files.getAttachUrl(pagename, image_name,
                                            macro.request, thumb=True,
                                            size=px_size, ticket=ticketString),
                         image_name))
    else:
        x, y = getImageSize(pagename, image_name, macro.request)

        if not x and not y:
            # image has no size..something went amuck
            setImageSize(pagename, image_name, macro.request)
            x, y = getImageSize(pagename, image_name, macro.request)

        if not border and not caption:
            img_string = ('<a href="%s">'
                          '<img class="borderless" src="%s" alt="%s"/></a>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name))
        elif border and not caption:
            img_string = ('<a href="%s">'
                          '<img class="border" src="%s" alt="%s"/></a>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name))
        elif border and caption:
            img_string = ('<a href="%s">'
                          '<img class="border" src="%s" alt="%s"/></a>'
                          '<div style="width: %spx;">'
                          '<p class="normalCaption">%s</p></div>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name, x, caption))
        elif not border and caption:
            img_string = ('<a href="%s">'
                          '<img class="borderless" src="%s" alt="%s"/></a>'
                          '<div style="width: %spx;">'
                          '<p class="normalCaption">%s</p></div>' %
                          (full_size_url,
                           Files.getAttachUrl(pagename, image_name,
                                              macro.request,
                                              ticket=ticketString),
                           image_name, x, caption))

        if alignment == 'right':
            img_string = '<span class="floatRight">' + img_string + '</span>'
        elif alignment == 'left':
            img_string = '<span class="floatLeft">' + img_string + '</span>'

        html.append(img_string)
      
    macro_text += ''.join(html)
    return macro_text
Example #26
0
def _make_index_key(index_letters, additional_html=""):
    links = map(lambda ch:
                    '<a href="#%s">%s</a>' %
                    (wikiutil.quoteWikiname(ch), ch.replace('~', 'Others')),
                index_letters)
    return "<p>%s%s</p>" % (' | '.join(links), additional_html)
Example #27
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    _ = macro.request.getText

    re_args = re.search('(?P<caption>.+)\,\s(?P<the_rest>.*)', args)
    pagename = re_args.group('caption')
    items = re_args.group('the_rest')
    page = Page(pagename, macro.request)

    try:
        links = max(int(items), 1)
    except StandardError:
        links = 1

    raw = page.get_raw_body(fresh=macro.request.set_cache)
    if not macro.request.user.may.read(page):
        raw = ""

    # this selects lines looking like a list item
    # !!! TODO: make multi-line quotes possible
    # (optionally split by "----" or something)
    quotes = raw.splitlines()
    if links > 1:
        quotes = [quote for quote in quotes if quote.startswith(' *')]
        random.shuffle(quotes)
        while len(quotes) > links:
            quotes = quotes[:-1]
        quote = ''

        for name in quotes:
            quote = quote + name + '\n'
            
        page.set_raw_body(quote, 1)
        out = cStringIO.StringIO()
        macro.request.redirect(out)
        page.send_page(content_only=1,
                       content_id="randomquote_%s" %
                                   wikiutil.quoteWikiname(page.page_name) )
        quote = out.getvalue()
        macro.request.redirect()
    else:
        quotes = [quote.strip() for quote in quotes]
        quotes = [quote[2:] for quote in quotes if quote.startswith('* ')]
        if quotes:
            quote = random.choice(quotes)
        else:
            quote = ''

        page.set_raw_body(quote, 1)
        out = cStringIO.StringIO()
        macro.request.redirect(out)
        page.send_page(content_only=1,
                       content_id="randomquote_%s" %
                                  wikiutil.quoteWikiname(page.page_name) )
        quote = out.getvalue()
        macro.request.redirect()

    if not quotes:
        return (macro.formatter.highlight(1) +
                _('No quotes on %(pagename)s.') % {'pagename': pagename} +
                macro.formatter.highlight(0))
    
    return quote.decode(config.charset)
Example #28
0
def execute(macro, args, formatter=None, **kw):
    if not formatter:
        formatter = macro.formatter
    
    request = macro.request
    _ = request.getText

    # set up javascript entry grouping -- this happens when the page renders
    request.write('<script type="text/javascript">'
                  'onLoadStuff.push(\'groupAllRcChanges();\');'
                  '</script>\n')
    request.write('<script type="text/javascript" src="/wiki/revipbox.js"></script>\n')

    pagename = formatter.page.page_name
    q_pagename = wikiutil.quoteWikiname(pagename)
    rc_page = Page(pagename, request)

    d = {}
    d['q_page_name'] = q_pagename
    d['page'] = rc_page

    if args == 'global':
        wiki_global = True
    else:
        wiki_global = False

    # set max size in days
    max_days = min(int(request.form.get('max_days', [0])[0]),
                   _DAYS_SELECTION[-1])

    # get bookmark from valid user
    bookmark = request.user.getBookmark(wiki_global=wiki_global)

    # default to _MAX_DAYS for users without rc bookmark
    if not max_days:
        max_days = _MAX_DAYS
    d['rc_max_days'] = max_days

    if wiki_global:
        watched_wikis = request.user.getWatchedWikis()
        lines = wikidb.getRecentChanges(request, max_days=max_days,
                                        changes_since=bookmark,
                                        wiki_global=wiki_global,
                                        on_wikis=watched_wikis)
    else:
        lines = wikidb.getRecentChanges(request, max_days=max_days,
                                        changes_since=bookmark,
                                        wiki_global=wiki_global)

    tnow = time.time()
    msg = ""

    do_we_show_comments = request.user.getShowComments()
    setup_show_comments(do_we_show_comments, rc_page, request, d)

    add_bookmark_link(rc_page, tnow, bookmark, wiki_global, request, d)
        
    print_rc_header(request, d)
    
    if not lines:
        if wiki_global:
            request.write('<p>This page shows you changes on '
                          '<strong>all</strong> of the wikis you are watching!'
                          '</p>')
            if not watched_wikis:
                if request.user.valid:
                    request.write('<p>You are not watching any wikis, though.  '
                                  'To watch a wiki, simply go to the wiki you\'re '
                                  'interested in and click the "watch this wiki" '
                                  'link next to your user settings in the upper '
                                  'right.</p>')
                else:
                    request.write('<p>You are not logged in.  Please login to '
                                  'view changes on the wikis you are watching.'
                                  '</p>')
        if not wiki_global or watched_wikis:
            request.write("<p>No recent changes.  Quick &mdash; change "
                          "something while nobody's looking!</p>")

    lines_by_day = group_changes_by_day(lines, tnow, max_days, request)
    for day, lines in lines_by_day:
        print_day(day, request, d)
        if wiki_global and request.user.getRcGroupByWiki():
            lines_grouped = group_changes_by_wiki(lines, request)
            wiki_names_sorted = lines_grouped.keys()
            wiki_names_sorted.sort()
            for wiki_name in wiki_names_sorted:
                if lines_grouped[wiki_name]:
                    request.write('<h3 style="padding: .2em;">%s:</h3>' %
                                  farm.link_to_wiki(wiki_name, formatter))
                    print_changes(lines_grouped[wiki_name], bookmark, tnow,
                                  max_days, do_we_show_comments, d,
                                  wiki_global, macro, request, formatter,
                                  grouped=True)
        else:
            print_changes(lines, bookmark, tnow, max_days, do_we_show_comments,
                          d, wiki_global, macro, request, formatter)

    d['rc_msg'] = msg
    request.write(request.theme.recentchanges_footer(d))

    return ''
Example #29
0
    def username(self, d):
        """
        Assemble the username / userprefs link
        
        @param d: parameter dictionary
        @rtype: string
        @return: username html
        """
        _ = self.request.getText
        if self.request.user.valid:
            watch_wiki = ''
            if config.wiki_farm:
                if not self.request.user.isWatchingWiki(
                    self.request.config.wiki_name):
                    watch_wiki = ('| %s ' %
                        Page(d['page_name'],self.request).link_to(
                            know_status=True, know_status_exists=True,
                            text='watch this wiki',
                            querystr='action=watch_wiki&wikiname=%s' %
                                self.request.config.wiki_name))

            if config.wiki_farm:
                wiki_base_url = farm.getBaseFarmURL(self.request)
            else:
                wiki_base_url = '%s/' % self.request.getScriptname()

            if self.request.user.name in wikiacl.Group("Admin", self.request):
                wiki_settings_pagelink = \
                    Page(config.wiki_settings_page, self.request).link_to(
                            text=config.wiki_settings_page.lower())
                admin_settings = ('%s | ' % wiki_settings_pagelink)
            else:
                admin_settings = ''

            html = (
                '<div class="user_area">'
                '<div class="welcome">Welcome, %s</div>'
                '%s'
                '<div class="user_items">'
                '(%s<a href="%s%s?from_wiki=%s">settings</a> %s| '
                '<a href="%s/%s?action=userform&amp;logout=Logout">logout</a>)'
                '</div></div>' %
                (user.getUserLink(self.request, self.request.user),
                 self.userNotificationLink(self.request.user),
                 admin_settings, wiki_base_url,
                 wikiutil.quoteWikiname(config.page_user_preferences),
                 self.request.config.wiki_name, watch_wiki,
                 self.request.getScriptname(), d['q_page_name']))
        else:
            if config.wiki_farm:
                post_url = "%s%s" % (
                    farm.getBaseFarmURL(self.request,
                                        force_ssl=config.use_ssl),
                    wikiutil.quoteWikiname(config.page_user_preferences))
                our_wiki_url = '%s/%s' % (self.request.getBaseURL(),
                                          d['q_page_name'])
                base_wiki = farm.getBaseFarmURL(self.request)
                farm_params = (
                    '<input type="hidden" name="backto_wiki" value="%s">'
                    '<input type="hidden" name="backto_page" value="%s">'
                    '<input type="hidden" name="qs" value="%s">' %
                    (self.request.config.wiki_name,
                     urllib.quote(our_wiki_url),
                     urllib.quote(self.request.query_string)))
            else:
                farm_params = ''
                post_url = '%s/%s' % (
                    self.request.getQualifiedURL(self.request.getScriptname(),
                                                 force_ssl=config.use_ssl),
                    wikiutil.quoteWikiname(config.page_user_preferences))
                base_wiki = '%s/' % self.request.getScriptname()
            html = (
                '<form action="%s" method="POST" '
                      'onsubmit="if (!canSetCookies()) { alert(\'You need '
                                    'cookies enabled to log in.\'); '
                                    'return false;}">'
                '<input type="hidden" name="action" value="userform">'
                '<div class="login_area">'
                '<table>'
                '<tr><td width="50%%" align="right" nowrap>User name:</td>'
                '<td colspan="2" align="left" nowrap>'
                '<input class="formfields" size="22" name="username" '
                       'type="text"></td> </tr> <tr>'
                '<td align="right">Password:</td>'
                '<td colspan="2" align="left" nowrap> '
                '<input class="formfields" size="22" type="password" '
                       'name="password"> '
                '<input type="hidden" name="login" value="Login">%s'
                '</td></tr><tr><td></td>'
                '<td align="left" nowrap>'
                '(<a href="%s%s?new_user=1&amp;from_wiki=%s">new user</a>)'
                '</td><td align="right">'
                '<input type="submit" name="login" value="Login" alt="login">'
                '</td></tr></table></div></form>' %
                (post_url, farm_params, base_wiki,
                 wikiutil.quoteWikiname(config.page_user_preferences),
                 self.request.config.wiki_name))
            
        return html
Example #30
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    macro.parser.inhibit_br += 2
    text = []
    if args:
        title = args
    else:
        title = "Comments:"
    if not macro.request.user.may.edit(macro.formatter.page):
        text.append('<h3>%s</h3>\n'
                    '<p><strong>Note: You must be logged in to add '
                    'comments</strong></p>\n' % title)
    else:
        text.append(
            '<h3>%(title)s</h3>\n'
            '<form method="POST" action="%(scriptname)s/%(q_pagename)s">\n'
            '<p><input type="hidden" name="action" value="comments">\n'
            '<textarea id="comment_text" name="comment_text_%(pghash)s" rows="1" '
                      'style="width:100%%" '
                      'onSelect="sizeTextField(this.id,event)" '
                      'onPaste="sizeTextField(this.id,event)" '
                      'onFocus="sizeTextField(this.id,event)" '
                      'onKeyPress="sizeTextField(this.id,event)">'
            '</textarea>\n'
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
                         'height: 0px!important; width: 0px!important; overflow: hidden;">'
            'dont enter into this box:'
            '<input type="text" name="comment_dont_%(pghash)s"/>'
            '</span>'
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
                         'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont1_%(pghash)s" '
                    'value="Add Comment (not! Do not press!)">\n'
            '</span>'
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
                         'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont2_%(pghash)s" '
                    'value="Add Comment (not! Do not press!)">\n'
            '</span>'
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
                         'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont3_%(pghash)s" '
                    'value="Add Comment (not! Do not press!)">\n'
            '</span>'
            '<input class="formbutton" type="submit" name="button_do_%(pghash)s" '
                    'value="Add Comment">\n'
            '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;'
                         'height: 0px!important; width: 0px!important; overflow: hidden;">'
            '<input class="formbutton" type="submit" name="button_dont4_%(pghash)s" '
                    'value="Add Comment (not! Do not press!)">\n'
            '</span>'
            '</p>\n'
            '</form>' % {'title': title,
                         'scriptname': macro.request.getScriptname(),
                         'pghash': hash(macro.formatter.page.page_name.lower()),
                         'q_pagename': wikiutil.quoteWikiname(macro.formatter.page.proper_name())})

    # we want to print a paragraph after the comments area if there's
    # anything following it
    macro.parser.force_print_p = True

    return formatter.rawHTML(''.join(text))
Example #31
0
def render_favorites(local_favoriteList, request, formatter, macro,
                     wiki_global):
    seen_list = []
    line_of_text = ''
    for page_line in local_favoriteList:
        page = Page(page_line.pagename, request,
                    wiki_name=page_line.wiki_name)
        page_line.comment = Comment(request, page_line.comment,
                                    page_line.action, page=page).render()
        bookmark = request.user.getFavBookmark(page)

        # in the case of uploads/deletes of images, etc we'd like to show
        # a useful comment
        page_line.time_tuple = request.user.getTime(page_line.ed_time)
        day = page_line.time_tuple[0:3]
        if not wiki_global:
              wiki_link = ''
        else:
              wiki_link = ('<span class="minorText">(on %s)</span>' %
                           farm.link_to_wiki(page_line.wiki_name, formatter))

        if page_line.ed_time > bookmark:
              # We do bold
              edit_icon = format_page_edit_icon(request, [page_line], page,
                                                True, bookmark, formatter)
              line_of_text = ('<div class="rcpagelink"><span><b>'
                              '%s</b> &nbsp; %s%s<b>' %
                              (edit_icon, page.link_to(absolute=True),
                               wiki_link))
              line_of_text = (
                  line_of_text + " &nbsp;" +
                  '<span align="right" style="font-size: 12px;">' +
                  'last modified ')
              line_of_text = line_of_text + '%s %s' % (find_month[day[1]],
                                                       day[2])
              line_of_text = (line_of_text +
                  time.strftime(" at %I:%M %p</b> by</span>",
                                page_line.time_tuple) +
                  '<span class="faveditor">')
              if page_line.comment:
                      line_of_text = (
                          line_of_text +
                          ' %s</span><span class="favcomment"> (%s)</span>' %
                          (getEditor(page_line, request), page_line.comment))
              else:
                      line_of_text = (line_of_text +
                          ' %s</span>' % (getEditor(page_line, request)))
              line_of_text = (
                  line_of_text +
                  '<span style="font-size:12px;">&nbsp;&nbsp;'
                  '[<a href="%s/%s?action=favorite&delete=%s&wiki_name=%s">'
                  'Remove</a>]</span>' %
                  (request.getScriptname(),
                   wikiutil.quoteWikiname(
                      macro.formatter.page.proper_name()),
                   wikiutil.quoteWikiname(page_line.pagename),
                   page.wiki_name) +
                  '</span></div>')

        else:
          edit_icon = format_page_edit_icon(request, [page_line], page,
                                            False, bookmark, formatter)
          # We don't do bold
          if page_line.ed_time: # page has been created
              line_of_text = ('<div class="rcpagelink"><span>'
                              '%s &nbsp; %s%s &nbsp;<span class="favtime">'
                              'last modified ' %
                              (edit_icon, page.link_to(absolute=True),
                               wiki_link))
              line_of_text = line_of_text + '%s %s' % (find_month[day[1]],                                                             day[2]) 
              line_of_text = (
                  line_of_text +
                  time.strftime(" at %I:%M %p by</span>",
                                page_line.time_tuple) +
                  '<span class="faveditor">')
              if page_line.comment:
                  line_of_text = (line_of_text +
                      ' %s</span><span class="favcomment"> (%s)</span>' %
                      (getEditor(page_line, request), page_line.comment))
              else:
                  line_of_text = line_of_text + ' %s</span>' % (
                      getEditor(page_line, request))

              line_of_text = (
                  line_of_text + '<span style="font-size:12px;">&nbsp;&nbsp;'
                  '[<a href="%s/%s?action=favorite&delete=%s&wiki_name=%s">'
                  'Remove</a>]</span>' %
                  (request.getScriptname(),
                   wikiutil.quoteWikiname(
                      macro.formatter.page.proper_name()),
                   wikiutil.quoteWikiname(page_line.pagename),
                   page.wiki_name))
              line_of_text = line_of_text + '</span></div>'
          else: # page has NOT been created
              line_of_text = ('<div class="rcpagelink"><span>'
                              '%s &nbsp; %s%s &nbsp;'
                              '<span align="right" class="favtime">'
                              'page has not been created yet</span>' %
                              (edit_icon, page.link_to(absolute=True),
                               wiki_link))
              line_of_text = (line_of_text +
                  '<span style="font-size:12px;">&nbsp;&nbsp;'
                  '[<a href="%s/%s?action=favorite&delete=%s&wiki_name=%s">'
                  'Remove</a>]</span>' %
                  (request.getScriptname(), wikiutil.quoteWikiname(
                      macro.formatter.page.proper_name()),
                   wikiutil.quoteWikiname(page_line.pagename),
                   page.wiki_name))
              line_of_text = line_of_text + '</span></div>'

        seen_list.append((page_line.pagename, line_of_text))

    return seen_list
Example #32
0
    def asHTML(self):
        """
        Create the complete HTML form code.
        """
        _ = self._
        self.make_form()

        # different form elements depending on login state
        html_uid = ''
        html_sendmail = ''
        groups_pagename = "%s/%s" % (config.wiki_settings_page,
            config.wiki_settings_page_security_defaults)
        if self.request.user.name in wikiacl.Group("Admin", self.request):
            group_admin = wikiacl.Group("Admin", self.request, fresh=True)
            self.make_row(_("Admins"), [
                html.TEXTAREA(name="group_Admin", rows="6", cols="40",
                              id="group_Admin").append(
                                '\n'.join(map(wikiutil.escape,
                                    group_admin.users(proper_names=True))))
                ],
                option_text=_("(one per line)"))


            group_banned = wikiacl.Group("Banned", self.request, fresh=True)
            self.make_row(_("Banned Users"), [
                html.TEXTAREA(name="group_Banned", rows="6", cols="40",
                              id="group_Banned").append(
                                '\n'.join(map(wikiutil.escape,
                                    group_banned.users(proper_names=True))))
                ],
                option_text=_("(one per line)"))

            self.make_row(_("Banned IP Addresses"), [
                html.TEXTAREA(name="ips_banned", rows="6", cols="40",
                              id="ips_banned").append(
                                '\n'.join(map(wikiutil.escape,
                                    group_banned.get_ips().keys())))
                ],
                option_text=_("(one per line)"))

            custom_groups = user.getGroupList(self.request,
                exclude_special_groups=True)
            for groupname in custom_groups:
                group = wikiacl.Group(groupname, self.request, fresh=True)
                delete_label = ('<span class="minorActionBox">[<a href="%s/'
                                '%s?action=usergroupsettings&delete=%s">'
                                'delete group</a>]</span>') % (
                                    self.request.getScriptname(),
                                    quoteWikiname(groups_pagename),
                                    quoteWikiname(groupname))
                self.make_row('%s %s' % (wikiutil.escape(groupname),
                                         delete_label),
                              [
                                  html.TEXTAREA(
                                    name="group_%s" % quoteWikiname(groupname),
                                    rows="6", cols="40",
                                    id="group_%s" % quoteWikiname(groupname)
                                  ).append('\n'.join(map(wikiutil.escape,
                                    group.users(proper_names=True))))
                              ], option_text=_("(one per line)"))

            buttons = [
                ('save', _('Save Groups')),
            ]

            # Add buttons
            button_cell = []
            for name, label in buttons:
                button_cell.extend([
                    html.INPUT(type="submit", name=name, value=label),
                    ' ',
                ])
            self.make_row('', button_cell)

            self._inner.append(html.H2().append("Create a new group"))

            self.make_row(_("Group name"), [
              html.INPUT(type="text", size="40", name="new_group_name"),
            ])

            self.make_row('Group users', [
              html.TEXTAREA(name="new_group_users", rows="6", cols="40")
            ])

            buttons = [
                ('save', _('Add new group')),
            ]

            # Add buttons
            button_cell = []
            for name, label in buttons:
                button_cell.extend([
                    html.INPUT(type="submit", name=name, value=label),
                    ' ',
                ])
            self.make_row('', button_cell)


        return str(self._form)
Example #33
0
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    _ = macro.request.getText

    # prevent recursive calls
    global _guard
    if _guard:
        return ''
    html = []

    # flush request output because this may take a second to generate
    macro.request.flush()

    # build a list of wanted pages tuples.
    # (pagename, k) where k is the number of links to pagename
    wanted_results = raw_wanted_results(macro)

    if not wanted_results:
        macro.request.write("<p>%s</p>" % _("No wanted pages in this wiki."))
        return ''

    # we have wanted pages, so let's generate a list of
    # where the wanted pages are wanted from
    wanted = where_wanted_from(wanted_results, macro)

    # find the 'most wanted' pages
    wanted.sort(comparey)
    most_wanted = wanted[0:60]
    #alphabetize these
    most_wanted.sort(comparey_alpha)

    # usually 'Wanted Page' or something such
    pagename = macro.request.getPathinfo()[1:] 

    if not showUsers(macro.request):
        html.append('<div style="float: right;">'
                    '<div class="actionBoxes"><span>%s</span></div></div>' %
                    wikiutil.link_tag(macro.request,
                                      pagename + "?show_users=true",
                                      "show users"))
    else:
      html.append('<div style="float: right;">'
                  '<div class="actionBoxes"><span>%s</span></div></div>' %
                  wikiutil.link_tag(macro.request, pagename, "hide users"))
    html.append(
        '<p>The "most" wanted pages based upon the number of links made from '
        'other pages (bigger means more wanted):</p>\n'
        '<div style="margin-top: 0px; margin-left: auto; margin-right: auto; '
                    'width: 760px; text-align: left; vertical-align: top; '
                    'padding-left: 7px; padding-right: 7px;">\n'
        '<p style="padding: 15px;  line-height: 1.45; margin-top: 0; '
                  'padding-left: 7px; padding-right: 7px; width: 760px; '
                  'solid 1px #eee; background: #f5f5f5; '
                  'border: 1px solid rgb(170, 170, 170); ">\n')

    # find the max number of links
    number_list = []
    for name, number, source_name in most_wanted:
        number_list.append(number)
    if number_list:
        max_links = max(number_list)
    else:
        max_links = 0

    for name, number, source_pagenames in most_wanted:
        print_number = ((number*1.0)/max_links) * 30
        if print_number < 12:
            print_number = 12
        html.append('<a class="nonexistent" style="font-size: %spx;  '
                                                  'margin-top: 10px; '
                                                  'margin-bottom: 10px; '
                                                  'margin-right: 5px; " '
                       'href="%s/%s">%s</a> &nbsp;' %
                    (print_number, macro.request.getBaseURL(),
                     wikiutil.quoteWikiname(name), name))

    html.append('</p></div>')
    macro.request.write(''.join(html))
    macro.request.write('<p>What follows is a list of all "wanted" pages.  '
                        'Each wanted page includes a list, following it, of '
                        'all the pages where it is referred to:</p>\n')

    macro.request.write('<ol>\n')
    output_complete_wanted_list(wanted, macro)
    macro.request.write("</ol>")

    return ''