Changeset 105:87a0409582f7


Ignore:
Timestamp:
05/02/2010 19:07:51 (7 months ago)
Author:
tonio
Branch:
default
Message:

Ticket #32 + minor CSS modifications.

Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • admin/templatetags/admin_extras.py

    r104 r105  
    9191@register.simple_tag 
    9292def param(app, definition): 
    93     print definition 
    9493    result = """<div class='row'> 
    9594  <label>%s</label>""" % definition["name"] 
     95    name = "%s.%s" % (app, definition["name"]) 
    9696    if definition["type"] in ["string", "int"]: 
    9797        value = definition.has_key("value") \ 
    9898            and definition["value"] or definition["default"] 
    99         name = "%s.%s" % (app, definition["name"]) 
    10099        result += """ 
    101100  <input type='text' name='%s' id='%s' value='%s' />""" % (name, name, value) 
    102     if definition["type"] in ["list"]: 
     101    if definition["type"] in ["list", "list_yesno"]: 
    103102        result += """ 
    104 <select name='' id=''>""" 
    105          
     103<select name='%s' id='%s'>""" % (name, name) 
     104        values = [] 
     105        if definition["type"] == "list_yesno": 
     106            values = [("yes", _("Yes")), ("no", _("No"))] 
     107        else: 
     108            if definition.has_key("values"): 
     109                values = definition["values"] 
     110        value = definition.has_key("value") \ 
     111            and definition["value"] or definition["default"] 
     112        for v in values: 
     113            selected = "" 
     114            if value == v[0]: 
     115                selected = " selected='selected'" 
     116            result += "<option value='%s'%s>%s</option>\n" % (v[0], selected, v[1]) 
    106117        result += """ 
    107118</select> 
  • admin/views.py

    r104 r105  
    414414        tmp = {"name" : app, "params" : []} 
    415415        for p in sorted(parameters._params[app]): 
    416             tmp["params"] += [{"name" : p, "value" : parameters.get(app, p), 
     416            tmp["params"] += [{"name" : p,  
     417                               "value" : parameters.get(app, p), 
    417418                               "help" : parameters._params[app][p]["help"], 
     419                               "default" : parameters._params[app][p]["default"], 
    418420                               "type" : parameters._params[app][p]["type"]}] 
    419421        gparams += [tmp] 
  • extensions/webmail/imap_listing.py

    r103 r105  
    44import time 
    55import imaplib 
     6import ssl 
    67from datetime import datetime, timedelta 
    78from email.header import decode_header 
     
    7071    @staticmethod 
    7172    def parse_date(value): 
    72         ndate = datetime(*(email.utils.parsedate_tz(value))[:7]) 
     73        tmp = email.utils.parsedate_tz(value) 
     74        if not tmp: 
     75            return value 
     76        ndate = datetime(*(tmp)[:7]) 
    7377        now = datetime.now() 
    7478        if now - ndate > timedelta(7): 
     
    9195    def __init__(self, request=None, user=None, password=None): 
    9296        self.address = parameters.get("webmail", "IMAP_SERVER") 
     97        self.port = int(parameters.get("webmail", "IMAP_PORT")) 
    9398        if request: 
    9499            status, msg = self.login(request.user.username,  
     
    97102            status, msg = self.login(user, password) 
    98103        if not status: 
    99             # Gestion d'erreur 
    100             pass 
     104            raise Exception(msg) 
    101105 
    102106    def login(self, user, passwd): 
    103107        import imaplib 
    104108        try: 
    105             self.m = imaplib.IMAP4_SSL(self.address) 
     109            secured = parameters.get("webmail", "IMAP_SECURED") 
     110            if secured == "yes": 
     111                self.m = imaplib.IMAP4_SSL(self.address, self.port) 
     112            else: 
     113                self.m = imaplib.IMAP4(self.address, self.port) 
     114        except (imaplib.IMAP4.error, ssl.SSLError), error: 
     115            return False, _("Connection to IMAP server failed, check your configuration") 
     116        try: 
    106117            self.m.login(user, passwd) 
    107         except imaplib.IMAP4.error, test: 
    108             return False, test 
     118        except (imaplib.IMAP4.error, ssl.SSLError), error: 
     119            return False, _("Authentication failed, check your configuration") 
     120             
    109121        return True, None 
    110122 
     
    114126        return folder.encode("imap4-utf-7") 
    115127 
    116     def messages_count(self, folder=None): 
     128    def messages_count(self, folder=None, order=None): 
     129        if order: 
     130            sign = order[:1] 
     131            criterion = order[1:].upper() 
     132            if sign == '-': 
     133                criterion = "REVERSE %s" % criterion 
     134        else: 
     135            criterion = "REVERSE DATE" 
     136        print criterion 
     137 
    117138        (status, data) = self.m.select(self._encodefolder(folder)) 
    118         (status, data) = self.m.sort("(REVERSE DATE)", "UTF-8", "(NOT DELETED)") 
     139        (status, data) = self.m.sort("(%s)" % criterion, "UTF-8", "(NOT DELETED)") 
    119140        self.messages = data[0].split() 
    120141        return len(self.messages) 
  • extensions/webmail/main.py

    r104 r105  
    1010from django.contrib.auth.decorators import login_required 
    1111from mailng.admin.models import Mailbox 
    12 from mailng.lib import events, parameters, _render 
     12from mailng.lib import events, parameters, _render, _render_error 
    1313from mailng.lib.email_listing import Email 
    1414from imap_listing import * 
     
    2121    parameters.register("webmail", "IMAP_SERVER", "string", "127.0.0.1", 
    2222                        help=_("Address of your IMAP server")) 
    23     parameters.register("webmail", "IMAP_SECURED", "list", "No", 
     23    parameters.register("webmail", "IMAP_SECURED", "list_yesno", "no", 
    2424                        help=_("Use a secure connexion to access IMAP server")) 
    2525    parameters.register("webmail", "IMAP_PORT", "int", "143", 
     
    6161        request.session["folder"] = name 
    6262        request.session["page"] = pageid 
     63    order = request.GET.has_key("order") and request.GET["order"] or None 
    6364    lst = ImapListing(request.user.username, request.session["password"], 
    64                       name, folder=name) 
     65                      name, folder=name, order=order) 
    6566    page = lst.paginator.getpage(request.session["page"]) 
    6667    if page: 
     
    7677@login_required 
    7778def index(request): 
    78     lst = ImapListing(request.user.username, request.session["password"], 
    79                       "INBOX", folder="INBOX") 
     79    try: 
     80        lst = ImapListing(request.user.username, request.session["password"], 
     81                          "INBOX", folder="INBOX") 
     82    except Exception as exp: 
     83        return _render_error(request, {"error" : exp}) 
    8084    return lst.render(request, empty=True) 
    8185 
  • extensions/webmail/templates/index.html

    r102 r105  
    208208    }); 
    209209    $$("tr").addEvent("dblclick", viewmail); 
     210    var sortOrder = ""; 
     211    $$("th[class=sortable]").addEvent("click", function(evt) { 
     212        var tmp = "?"; 
     213         
     214        if (sortOrder == "") { 
     215            test = /order=([\+\-]\w+$|&)/.exec(location.hash); 
     216            if (test) { 
     217                sortOrder = test[1]; 
     218            } 
     219        } 
     220        if (sortOrder.substring(1) == evt.target.id) { 
     221            var sign = (sortOrder.charAt(0) == '+') ? '-' : '+'; 
     222            sortOrder = sign + evt.target.id; 
     223        } else { 
     224            sortOrder = "-" + evt.target.id; 
     225        } 
     226        if (location.hash.indexOf("?") != -1) { 
     227            if (location.hash.indexOf("order") != -1) { 
     228                location.hash = location.hash.replace(/order=[\+\-]\w+$|&/,  
     229                                                      "order=" + sortOrder); 
     230                return; 
     231            } 
     232            tmp = "&"; 
     233        } 
     234        location.hash += tmp + "order=" + sortOrder; 
     235    }); 
    210236  }); 
    211237 
     
    225251{% endblock %} 
    226252{% block middletitle %}{% trans "Webmail" %}{% endblock %} 
    227 {% block menu %} 
    228   {% load webextras %} 
    229   {% listing_menu "" "INBOX" perms %} 
    230 {% endblock %} 
    231253{% block leftcol %} 
    232254<div id="leftcol" class="box"> 
  • lib/__init__.py

    r101 r105  
    5151                              context_instance=RequestContext(request)) 
    5252 
     53def _render_error(request, user_context): 
     54    return render_to_response("common/error.html", user_context, 
     55                              context_instance=RequestContext(request)) 
     56 
    5357def exec_as_vuser(cmd): 
    5458    code, output = exec_pipe("sudo -u %s %s" % (settings.VIRTUAL_UID, cmd)) 
  • lib/email_listing.py

    r100 r105  
    8181        self.folder = folder 
    8282        self.elems_per_page = elems_per_page 
    83         self.paginator = Paginator(self.mbc.messages_count(self.folder),  
     83        order = "order" in kwargs.keys() and kwargs["order"] or None 
     84        self.paginator = Paginator(self.mbc.messages_count(self.folder, order),  
    8485                                   elems_per_page) 
    8586 
  • lib/parameters.py

    r90 r105  
    2525                                                                       self.name) 
    2626 
    27 def register(app, name, type="string", deflt=None, help=None): 
     27def register(app, name, type="string", deflt=None, help=None, **kwargs): 
    2828    """Register a new parameter. 
    2929 
  • static/js/common.js

    r100 r105  
    2424    } else { 
    2525        var splits = current_anchor.substring(1).split('?'); 
    26         var section = splits[0]; 
     26        var section = (splits[0] != "") ? splits[0] : "INBOX"; 
    2727        delete splits[0]; 
    2828        var params = splits.join('&'); 
  • static/js/domains.js

    r90 r105  
    6767        } 
    6868    }); 
     69    setDivHeight("content", 20, 0); 
    6970}); 
    7071 
  • static/js/settings.js

    r103 r105  
    44         
    55    }); 
     6    setDivHeight("content", 20, 0); 
    67 
    78    if ($$("a[name=deletePerm]")) 
  • static/stylesheets/default.css

    r103 r105  
    263263 
    264264.toggler { 
    265     color: #222; 
    266     margin: 0; 
     265    margin: 5px auto; 
    267266    padding: 2px 5px; 
    268     background: #eee; 
    269     border-bottom: 1px solid #ddd; 
    270     border-right: 1px solid #ddd; 
    271     border-top: 1px solid #f5f5f5; 
    272     border-left: 1px solid #f5f5f5; 
    273     font-size: small; 
    274     font-weight: normal; 
     267    background: #CEDBEC; 
     268    -moz-border-radius: 5px; 
     269    -webkit-border-radius: 5px; 
     270    /*border: 1px solid #CCC;*/ 
     271    font-size: 1.1em; 
    275272} 
    276273 
     
    288285    padding: 3px 0; 
    289286} 
     287 
     288.error { 
     289    margin: 0 auto; 
     290    padding: 5px; 
     291    background: red; 
     292    width: 500px; 
     293    text-align: center; 
     294    background-color: #F9D2D2; 
     295    border: 3px solid #FF2A2A; 
     296    color: #FF2A00; 
     297} 
  • templates/common/tables.html

    r100 r105  
    33    <tr> 
    44      {% for c in table.columns %} 
    5       <th width="{{ c.width }}">{{ c|safe }}</th> 
     5      <th id="{{ c.name }}" class="sortable" width="{{ c.width }}">{{ c|safe }}</th> 
    66      {% endfor %} 
    77    </tr> 
Note: See TracChangeset for help on using the changeset viewer.