def graphs(request): gset = request.GET.get("gset", None) graph_sets = {} for result in signals.get_graph_sets.send(sender="index"): graph_sets.update(result[1]) if gset not in graph_sets: raise NotFound(_("Unknown graphic set")) searchq = request.GET.get("searchquery", None) period = request.GET.get("period", "day") tplvars = dict(graphs={}, period=period) domain = check_domain_access(request.user, searchq) if domain is None: return render_to_json_response({}) tplvars["domain"] = domain if period == "custom": if "start" not in request.GET or "end" not in request.GET: raise BadRequest(_("Bad custom period")) start = request.GET["start"] end = request.GET["end"] expr = re.compile(r'[:\- ]') period_name = "%s_%s" % (expr.sub('', start), expr.sub('', end)) start = date_to_timestamp(expr.split(start)) end = date_to_timestamp(expr.split(end)) else: end = int(time.mktime(time.localtime())) start = "-1%s" % period period_name = period tplvars["graphs"] = graph_sets[gset].export(tplvars["domain"], start, end) tplvars["period_name"] = period_name tplvars["start"] = start tplvars["end"] = end return render_to_json_response(tplvars)
def index(request): """ FIXME: how to select a default graph set ? """ deflocation = "graphs/?gset=mailtraffic" if not request.user.is_superuser: if not Domain.objects.get_for_admin(request.user).count(): raise NotFound(_("No statistics available")) graph_sets = events.raiseDictEvent('GetGraphSets') periods = [{ "name": "day", "label": _("Day") }, { "name": "week", "label": _("Week") }, { "name": "month", "label": _("Month") }, { "name": "year", "label": _("Year") }] return render( request, 'stats/index.html', { "periods": periods, "selection": "stats", "deflocation": deflocation, "graph_sets": graph_sets })
def index(request): """ FIXME: how to select a default graph set ? """ deflocation = "graphs/?gset=mailtraffic" if not request.user.is_superuser: if not Domain.objects.get_for_admin(request.user).count(): raise NotFound(_("No statistics available")) graph_sets = {} for result in signals.get_graph_sets.send(sender="index"): graph_sets.update(result[1]) periods = [ {"name": "day", "label": _("Day")}, {"name": "week", "label": _("Week")}, {"name": "month", "label": _("Month")}, {"name": "year", "label": _("Year")}, {"name": "custom", "label": _("Custom")} ] return render(request, 'modoboa_stats/index.html', { "periods": periods, "selection": "stats", "deflocation": deflocation, "graph_sets": graph_sets })
def graphs(request): gset = request.GET.get("gset", None) gsets = events.raiseDictEvent("GetGraphSets") if not gset in gsets: raise NotFound(_("Unknown graphic set")) searchq = request.GET.get("searchquery", None) period = request.GET.get("period", "day") tplvars = dict(graphs={}, period=period) domain = check_domain_access(request.user, searchq) if domain is None: return render_to_json_response({}) tplvars["domain"] = domain if period == "custom": if not "start" in request.GET or not "end" in request.GET: raise BadRequest(_("Bad custom period")) start = request.GET["start"] end = request.GET["end"] expr = re.compile(r'[:\- ]') period_name = "%s_%s" % (expr.sub('', start), expr.sub('', end)) start = date_to_timestamp(expr.split(start)) end = date_to_timestamp(expr.split(end)) else: end = int(time.mktime(time.localtime())) start = "-1%s" % period period_name = period tplvars['graphs'] = gsets[gset].export(tplvars["domain"], start, end) tplvars["period_name"] = period_name tplvars["start"] = start tplvars["end"] = end return render_to_json_response(tplvars)
def update_mailbox(self, user, account): newaddress = None if self.cleaned_data["email"] != self.mb.full_address: newaddress = self.cleaned_data["email"] elif (account.group == "SimpleUsers" and account.username != self.mb.full_address): newaddress = account.username if newaddress is not None: self.mb.old_full_address = self.mb.full_address local_part, domname = split_mailbox(newaddress) try: domain = Domain.objects.get(name=domname) except Domain.DoesNotExist: raise NotFound(_("Domain does not exist")) if not user.can_access(domain): raise PermDeniedException self.mb.rename(local_part, domain) self.mb.use_domain_quota = self.cleaned_data["quota_act"] override_rules = True \ if not self.mb.quota or user.has_perm("admin.add_domain") \ else False self.mb.set_quota(self.cleaned_data["quota"], override_rules) self.mb.save() events.raiseEvent('MailboxModified', self.mb)
def set_recipients(self): """Recipients dispatching We make a difference between 'local' recipients (the ones hosted by Modoboa) and 'external' recipients. """ self.ext_rcpts = [] self.int_rcpts = [] total = 0 for k, v in self.cleaned_data.items(): if not k.startswith("recipients"): continue if v == "": continue local_part, domname = split_mailbox(v) if domname is None: raise BadRequest( u"%s %s" % (_("Invalid mailbox"), v) ) try: domain = Domain.objects.get(name=domname) except Domain.DoesNotExist: domain = None if domain is not None: try: rcpt = Alias.objects.get(domain=domain, address=local_part) if rcpt.full_address == self.cleaned_data["email"]: rcpt = None except Alias.DoesNotExist: rcpt = None if rcpt is None: try: rcpt = Mailbox.objects.get(domain=domain, address=local_part) except Mailbox.DoesNotExist: raise NotFound( _("Local recipient %s not found" % v) ) if rcpt in self.int_rcpts: raise Conflict( _("Recipient %s already present" % v) ) self.int_rcpts += [rcpt] total += 1 continue if v in self.ext_rcpts: raise Conflict( _("Recipient %s already present" % v) ) self.ext_rcpts += [v] total += 1 if total == 0: raise BadRequest(_("No recipient defined"))
def set_recipients(self, address_list): """Set recipients for this alias. Special recipients: * local mailbox + extension: r_mailbox will be set to local mailbox * alias address == recipient address: valid only to keep local copies (when a forward is defined) and to create exceptions when a catchall is defined on the associated domain """ to_create = [] for address in set(address_list): if not address: continue if self.aliasrecipient_set.filter(address=address).exists(): continue local_part, domname, extension = ( split_mailbox(address, return_extension=True)) if domname is None: raise BadRequest( u"%s %s" % (_("Invalid address"), address) ) domain = Domain.objects.filter(name=domname).first() kwargs = {"address": address, "alias": self} if ( (domain is not None) and ( any( r[1] for r in signals.use_external_recipients.send( self, recipients=address) ) is False ) ): rcpt = Mailbox.objects.filter( domain=domain, address=local_part).first() if rcpt is None: rcpt = Alias.objects.filter( address='%s@%s' % (local_part, domname) ).first() if rcpt is None: raise NotFound( _("Local recipient {}@{} not found") .format(local_part, domname) ) if rcpt.address == self.address: raise Conflict kwargs["r_alias"] = rcpt else: kwargs["r_mailbox"] = rcpt to_create.append(AliasRecipient(**kwargs)) AliasRecipient.objects.bulk_create(to_create) # Remove old recipients self.aliasrecipient_set.exclude( address__in=address_list).delete()
def from_csv(self, user, row): """Import a relay domain alias from CSV. :param user: user importing the relay domain alias :param str row: relay domain alias definition """ if len(row) != 4: raise BadRequest(_("Invalid line")) self.name = row[1].strip() try: self.target = RelayDomain.objects.get(name=row[2].strip()) except RelayDomain.DoesNotExist: raise NotFound(_("Relay domain %s does not exist" % row[2].strip())) self.enabled = (row[3].strip() == 'True') self.save(creator=user)
def graphs(request): gset = request.GET.get("gset", None) gsets = events.raiseDictEvent("GetGraphSets") if not gset in gsets: raise NotFound(_("Unknown graphic set")) searchq = request.GET.get("searchquery", None) period = request.GET.get("period", "day") tplvars = dict(graphs=[], period=period) if searchq in [None, "global"]: if not request.user.is_superuser: if not Domain.objects.get_for_admin(request.user).count(): return render_to_json_response({}) tplvars.update( domain=Domain.objects.get_for_admin(request.user)[0].name) else: tplvars.update(domain="global") else: domain = Domain.objects.filter(name__contains=searchq) if domain.count() != 1: return render_to_json_response({}) if not request.user.can_access(domain[0]): raise PermDeniedException tplvars.update(domain=domain[0].name) if period == "custom": if not "start" in request.GET or not "end" in request.GET: raise BadRequest(_("Bad custom period")) start = request.GET["start"] end = request.GET["end"] G = Grapher() expr = re.compile(r'[:\- ]') period_name = "%s_%s" % (expr.sub('', start), expr.sub('', end)) for tpl in gsets[gset].get_graphs(): tplvars['graphs'].append(tpl.display_name) G.process(tplvars["domain"], period_name, str2Time(*expr.split(start)), str2Time(*expr.split(end)), tpl) tplvars["period_name"] = period_name tplvars["start"] = start tplvars["end"] = end else: tplvars['graphs'] = gsets[gset].get_graph_names() return render_to_json_response( {'content': _render_to_string(request, "stats/graphs.html", tplvars)})
def graphs(request): gset = request.GET.get("gset", None) gsets = events.raiseDictEvent("GetGraphSets") if not gset in gsets: raise NotFound(_("Unknown graphic set")) searchq = request.GET.get("searchquery", None) period = request.GET.get("period", "day") tplvars = dict(graphs={}, period=period) if searchq in [None, "global"]: if not request.user.is_superuser: if not Domain.objects.get_for_admin(request.user).count(): return render_to_json_response({}) tplvars.update( domain=Domain.objects.get_for_admin(request.user)[0].name) else: tplvars.update(domain="global") else: domain = Domain.objects.filter(name__contains=searchq) if domain.count() != 1: return render_to_json_response({}) if not request.user.can_access(domain[0]): raise PermDeniedException tplvars.update(domain=domain[0].name) if period == "custom": if not "start" in request.GET or not "end" in request.GET: raise BadRequest(_("Bad custom period")) start = request.GET["start"] end = request.GET["end"] expr = re.compile(r'[:\- ]') period_name = "%s_%s" % (expr.sub('', start), expr.sub('', end)) start = date_to_timestamp(expr.split(start)) end = date_to_timestamp(expr.split(end)) else: end = int(time.mktime(time.localtime())) start = "-1%s" % period period_name = period tplvars['graphs'] = gsets[gset].export(tplvars["domain"], start, end) tplvars["period_name"] = period_name tplvars["start"] = start tplvars["end"] = end return render_to_json_response(tplvars)
def index(request): """ FIXME: how to select a default graph set ? """ deflocation = "graphs/?gset=mailtraffic" if not request.user.is_superuser: if not Domain.objects.get_for_admin(request.user).count(): raise NotFound(_("No statistics available")) period = request.GET.get("period", "day") graph_sets = events.raiseDictEvent('GetGraphSets') return render( request, 'stats/index.html', { "periods": periods, "period": period, "selection": "stats", "deflocation": deflocation, "graph_sets": graph_sets })
def create_mailbox(self, user, account): """Create a mailbox associated to :kw:`account`.""" locpart, domname = split_mailbox(self.cleaned_data["email"]) try: domain = Domain.objects.get(name=domname) except Domain.DoesNotExist: raise NotFound(_("Domain does not exist")) if not user.can_access(domain): raise PermDeniedException try: Mailbox.objects.get(address=locpart, domain=domain) except Mailbox.DoesNotExist: pass else: raise Conflict( _("Mailbox %s already exists" % self.cleaned_data["email"]) ) events.raiseEvent("CanCreate", user, "mailboxes") self.mb = Mailbox(address=locpart, domain=domain, user=account, use_domain_quota=self.cleaned_data["quota_act"]) self.mb.set_quota(self.cleaned_data["quota"], user.has_perm("admin.add_domain")) self.mb.save(creator=user)
def graphs(request): gset = request.GET.get("gset", None) graph_sets = {} for result in signals.get_graph_sets.send(sender="index", user=request.user): graph_sets.update(result[1]) if gset not in graph_sets: raise NotFound(_("Unknown graphic set")) period = request.GET.get("period", "day") tplvars = {"graphs": {}, "period": period} fname = graph_sets[gset].get_file_name(request) if fname is None: raise BadRequest(_("Unknown domain")) tplvars["fname"] = fname if period == "custom": if "start" not in request.GET or "end" not in request.GET: raise BadRequest(_("Bad custom period")) start = request.GET["start"] end = request.GET["end"] expr = re.compile(r'[:\- ]') period_name = "%s_%s" % (expr.sub('', start), expr.sub('', end)) start = date_to_timestamp(expr.split(start)) end = date_to_timestamp(expr.split(end)) else: end = int(time.mktime(time.localtime())) start = "-1%s" % period period_name = period tplvars["domain_selector"] = graph_sets[gset].domain_selector tplvars["graphs"] = graph_sets[gset].export(tplvars["fname"], start, end) tplvars["period_name"] = period_name tplvars["start"] = start tplvars["end"] = end return render_to_json_response(tplvars)