def edit_record(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() csrf = request.POST.get('csrf', '') access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first() user_domains = [d.id for d in sess.query(PDNSDomain).filter_by(account=str(request.user.id))] if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) else: rectype = request.POST.get('type', None) if rectype == "domain": domain = sess.query(PDNSDomain).filter_by(id=int(request.POST.get('domainid', None))).first() if domain.id in user_domains: domain.name = request.POST.get('hostName', None) domain.dtype = request.POST.get('hostType', None) domain.master = request.POST.get('hostValue', None) elif rectype == "record": record = sess.query(PDNSRecord).filter_by(id=int(request.POST.get('recordid', None))).first() if record.domain_id in user_domains: record.name = request.POST.get('name', None) record.content = request.POST.get('content', None) record.rtype = request.POST.get('rtype', None) record.ttl = None if request.POST.get('ttl', None) == '' else request.POST.get('ttl', None); record.prio = None if request.POST.get('prio', None) == '' else request.POST.get('prio', None); sess.flush() return HTTPSeeOther(location=request.route_url('pdns.cl.domains', _query=(('sort', 'asc'),)))
def _wizcb_submit_hdl(wiz, em, step, act, val, req): xcls = cls if isinstance(xcls, str): xcls = _name_to_class(xcls) sess = DBSession() fieldIDs = json.loads(val['field_id']) templateName = val['template'] templId = val['templ_id'] for fid in fieldIDs: resvalue = { 'templ_id': templId, 'field_id': fid, 'template': templateName, 'field': sess.query(PDNSFieldType).filter( PDNSFieldType.id == fid).first() } em = ExtModel(xcls) obj = xcls() em.set_values(obj, resvalue, req, True) sess.add(obj) sess.flush() print("TROLOLO") return {'do': 'close', 'reload': True}
def delete_record(request): #if d in GET, delete domain #if r in GET, delete record #before delete check if this record exists and belongs to auth_user #delete and redirect to main module page #use _query to add aditional params when redirecting loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() csrf = request.POST.get('csrf', '') access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first() user_domains = [d.id for d in sess.query(PDNSDomain).filter_by(account=str(request.user.id))] if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains'), _query=(('error', 'asc'),)) else: domainid = request.POST.get('domainid', None) recid = request.POST.get('recordid', None) if domainid and not recid: domain = sess.query(PDNSDomain).filter_by(id=int(request.POST.get('domainid', None))).first() if domain.id in user_domains: sess.delete(domain) sess.flush() elif recid: record = sess.query(PDNSRecord).filter_by(id=int(request.POST.get('recordid', None))).first() if record.domain_id in user_domains: sess.delete(record) sess.flush() return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
def deleteMailBox(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() errmess = None csrf = request.POST.get('csrf', '') access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first() if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('postfix.cl.mail'), _query=(('error', 'asc'),)) else: domainid = request.POST.get('domainid', None) mboxid = request.POST.get('mboxid', None) if mboxid: mbox = sess.query(PostfixMailbox).filter_by(id=int(mboxid)).first() if mbox.username == access_user.nick: sess.delete(mbox) sess.flush() elif domainid: domain = sess.query(PostfixDomain).filter_by(id=int(domainid)).first() domainadmins = sess.query(PostfixDomainAdmins).filter_by(domain=domain.domain) if access_user.nick in [adm.username for adm in domainadmins]: sess.delete(domain) sess.query(PostfixDomainAdmins).filter_by(domain=domain.domain).delete() sess.flush() return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
def _wizcb_submit_hdl(wiz, em, step, act, val, req): xcls = cls if isinstance(xcls, str): xcls = _name_to_class(xcls) sess = DBSession() cfg = get_current_registry().settings fieldIDs = json.loads(val['field_id']) fieldlist = val['field'] templateName = val['template'] templId = val['templ_id'] for fid in fieldIDs: resvalue = {'templ_id' : templId, 'field_id' : fid, 'template' : templateName, 'field' : sess.query(PDNSFieldType).filter(PDNSFieldType.id==fid).first() } em = ExtModel(xcls) obj = xcls() em.set_values(obj, resvalue, req, True) sess.add(obj) sess.flush() print("TROLOLO") return { 'do' : 'close', 'reload' : True }
def delete(self, req, ctx, recurse=True, _flush=True): sess = DBSession() if recurse: for ch in self.children(ctx): self.delete(req, ch, recurse, False) sess.delete(ctx) if _flush: sess.flush()
def dyn_ticket_uwiz_update(params, request): tid = int(params['ticketid']) del params['ticketid'] sess = DBSession() model = ExtModel(Ticket) ticket = sess.query(Ticket).get(tid) if ticket is None: raise KeyError('Invalid ticket ID') for param in ('tstid', 'toid', 'name', 'descr'): if param in params: del params[param] # TODO: ENTITIES_LIST if not request.has_permission('TICKETS_CHANGE_STATE'): if 'ttrid' in params: del params['ttrid'] if not request.has_permission('TICKETS_CHANGE_FLAGS'): if 'flags' in params: del params['flags'] # TODO: USERS_LIST # TODO: GROUPS_LIST sess.execute(SetVariable('ticketid', ticket.id)) if 'ttrid' in params: ttr_id = params['ttrid'] if ttr_id: ttr_id = int(ttr_id) trans = sess.query(TicketStateTransition).get(ttr_id) if trans: sess.execute(SetVariable('ttrid', trans.id)) trans.apply(ticket) del params['ttrid'] if 'show_client' in params: show_cl = params['show_client'].lower() if show_cl in {'true', '1', 'on'}: show_cl = True else: show_cl = False del params['show_client'] else: show_cl = False sess.execute(SetVariable('show_client', npbool(show_cl))) if ('comments' in params) and request.has_permission('TICKETS_COMMENT', request.context, request): sess.execute(SetVariable('comments', params['comments'])) del params['comments'] else: sess.execute(SetVariable('comments', None)) model.set_values(ticket, params, request) sess.flush() sess.execute(SetVariable('tcid', None)) return { 'success' : True, 'action' : { 'do' : 'close', 'redraw' : [] } }
def client_oauth_register(request, regdict): nxt = request.route_url('access.cl.home') loc = get_localizer(request) headers = None #if authenticated_userid(request): # return HTTPSeeOther(location=nxt) cfg = request.registry.settings rate_id = int(cfg.get('netprofile.client.registration.rate_id', 1)) state_id = int(cfg.get('netprofile.client.registration.state_id', 1)) errors = {} sess = DBSession() login = regdict.get('username', None) passwd = regdict.get('password', None) email = regdict.get('email', None) name_family = regdict.get('familyname', '') name_given = regdict.get('givenname', '') ### !!!!! What if user changes his password in out database?! if login is not None and passwd is not None: q = sess.query(AccessEntity).filter(AccessEntity.nick == login, AccessEntity.access_state != AccessState.block_inactive.value) if q is not None: for user in q: if user.password == passwd: headers = remember(request, login) return headers if headers is None: ent = PhysicalEntity() ent.nick = login ent.email = email ent.name_family = name_family ent.name_given = name_given ent.state_id = state_id stash = Stash() stash.entity = ent stash.name = loc.translate(_('Primary Account')) acc = AccessEntity() acc.nick = login acc.password = passwd acc.stash = stash acc.rate_id = rate_id acc.state_id = state_id ent.children.append(acc) sess.add(ent) sess.add(stash) sess.add(acc) sess.flush() headers = remember(request, login) return headers else: return False
def dyn_ticket_uwiz_update(params, request): tid = int(params['ticketid']) del params['ticketid'] sess = DBSession() model = ExtModel(Ticket) ticket = sess.query(Ticket).get(tid) if ticket is None: raise KeyError('Invalid ticket ID') for param in ('tstid', 'toid', 'name', 'descr'): if param in params: del params[param] # TODO: ENTITIES_LIST if not request.has_permission('TICKETS_CHANGE_STATE'): if 'ttrid' in params: del params['ttrid'] if not request.has_permission('TICKETS_CHANGE_FLAGS'): if 'flags' in params: del params['flags'] # TODO: USERS_LIST # TODO: GROUPS_LIST sess.execute(SetVariable('ticketid', ticket.id)) if 'ttrid' in params: ttr_id = params['ttrid'] if ttr_id: ttr_id = int(ttr_id) trans = sess.query(TicketStateTransition).get(ttr_id) if trans: sess.execute(SetVariable('ttrid', trans.id)) trans.apply(ticket) del params['ttrid'] if 'show_client' in params: show_cl = params['show_client'].lower() if show_cl in {'true', '1', 'on'}: show_cl = True else: show_cl = False del params['show_client'] else: show_cl = False sess.execute(SetVariable('show_client', npbool(show_cl))) if ('comments' in params) and request.has_permission( 'TICKETS_COMMENT', request.context, request): sess.execute(SetVariable('comments', params['comments'])) del params['comments'] else: sess.execute(SetVariable('comments', None)) model.set_values(ticket, params, request) sess.flush() sess.execute(SetVariable('tcid', None)) return {'success': True, 'action': {'do': 'close', 'redraw': []}}
def make_collection(self, req, parent, name, rtype, props): sess = DBSession() creator = getattr(parent, 'dav_create', None) if (creator is None) or (not callable(creator)): raise DAVNotImplementedError('Unable to create child node.') obj = creator(req, name, rtype.types, props) if len(props) == 0: pset = set(dprops.DEFAULT_PROPS) else: pset = set(props.keys()) sess.flush() obj.__parent__ = parent return (obj, self.get_node_props(req, obj, pset))
def make_collection(self, req, parent, name, rtype, props): sess = DBSession() creator = getattr(parent, 'dav_create', None) if (creator is None) or (not callable(creator)): raise DAVNotImplementedError('Unable to create child node.') obj, modified = creator(req, name, rtype.types, props) if len(props) == 0: pset = set(dprops.DEFAULT_PROPS) else: pset = set(props.keys()) sess.flush() obj.__parent__ = parent return (obj, self.get_node_props(req, obj, pset))
def ff_tree_create(params, request): recs = [] sess = DBSession() user = request.user total = 0 for rec in params.get('records', ()): ff_name = rec.get('text') ff_parent = rec.get('parentId') # TODO: support changing uid/gid and rights, maybe? if not ff_name: raise ValueError('Empty folder names are not supported') if ff_parent and (ff_parent != 'root'): ff_parent = int(ff_parent) else: ff_parent = None ff = FileFolder(user=user, group=user.group) ff.name = ff_name root_ff = user.group.effective_root_folder if root_ff and (ff_parent is None): raise ValueError('Folder access denied') if ff_parent: ffp = sess.query(FileFolder).get(ff_parent) if ffp is None: raise KeyError('Unknown parent folder ID %d' % ff_parent) if (not ffp.can_write(user)) or (not ffp.can_traverse_path(user)): raise ValueError('Folder access denied') if root_ff and (not ffp.is_inside(root_ff)): raise ValueError('Folder access denied') ff.parent = ffp elif not user.root_writable: raise ValueError('Folder access denied') sess.add(ff) sess.flush() recs.append({ 'id' : str(ff.id), 'parentId' : str(ff.parent.id) if ff.parent else 'root', 'text' : ff.name, 'xhandler' : 'NetProfile.controller.FileBrowser', 'allow_read' : ff.can_read(user), 'allow_write' : ff.can_write(user), 'allow_traverse' : ff.can_traverse(user), 'parent_write' : ff.parent.can_write(user) if ff.parent else user.root_writable }) total += 1 return { 'success' : True, 'records' : recs, 'total' : total }
def edit_record(request): loc = get_localizer(request) sess = DBSession() csrf = request.POST.get('csrf', '') user_domains = [ d.id for d in sess.query(PDNSDomain) .filter_by(account=str(request.user.id)) ] if csrf != request.get_csrf(): request.session.flash({ 'text': loc.translate(_('Error submitting form')), 'class': 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) else: rectype = request.POST.get('type', None) if rectype == "domain": domain = sess.query(PDNSDomain).filter_by( id=int(request.POST.get('domainid', None)) ).first() if domain.id in user_domains: domain.name = request.POST.get('hostName', None) domain.dtype = request.POST.get('hostType', None) domain.master = request.POST.get('hostValue', None) elif rectype == "record": record = sess.query(PDNSRecord).filter_by( id=int(request.POST.get('recordid', None)) ).first() if record.domain_id in user_domains: record.name = request.POST.get('name', None) record.content = request.POST.get('content', None) record.rtype = request.POST.get('rtype', None) record.ttl = request.POST.get('ttl', None) if record.ttl == '': record.ttl = None record.prio = request.POST.get('prio', None) if record.prio == '': record.prio = None sess.flush() return HTTPSeeOther(location=request.route_url( 'pdns.cl.domains', _query=(('sort', 'asc'),)) )
def delete_record(request): # if d in GET, delete domain # if r in GET, delete record # before delete check if this record exists and belongs to auth_user # delete and redirect to main module page # use _query to add aditional params when redirecting loc = get_localizer(request) sess = DBSession() csrf = request.POST.get('csrf', '') user_domains = [ d.id for d in sess.query(PDNSDomain) .filter_by(account=str(request.user.id)) ] if csrf != request.get_csrf(): request.session.flash({ 'text': loc.translate(_('Error submitting form')), 'class': 'danger' }) return HTTPSeeOther( location=request.route_url('pdns.cl.domains'), _query=(('error', 'asc'),) ) else: domainid = request.POST.get('domainid', None) recid = request.POST.get('recordid', None) if domainid and not recid: domain = sess.query(PDNSDomain).filter_by( id=int(request.POST.get('domainid', None)) ).first() if domain.id in user_domains: sess.delete(domain) sess.flush() elif recid: record = sess.query(PDNSRecord).filter_by( id=int(request.POST.get('recordid', None)) ).first() if record.domain_id in user_domains: sess.delete(record) sess.flush() return HTTPSeeOther(location=request.route_url('pdns.cl.domains'))
def createMailBox(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() errmess = None csrf = request.POST.get('csrf', '') access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first() admindomains = sess.query(PostfixDomainAdmins).filter_by(username=str(request.user)) if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('postfix.cl.mail')) else: domain_name = request.POST.get('mbDomain', None) domain_descr = request.POST.get('mbDomainDescription', None) username = request.POST.get('mbUsername', None) mailbox_name = request.POST.get('mbName', None) mailbox_password = request.POST.get('mbPassword', None) if domain_name and username: if username == access_user.nick: if mailbox_name and mailbox_password: newmailbox = PostfixMailbox( username=username, password=mailbox_password, name=mailbox_name, domain=domain_name ) sess.add(newmailbox) sess.flush() else: if domain_name not in [ad.username for ad in admindomains]: newdomainadmin = PostfixDomainAdmins(username=username, domain=domain_name) newdomain = PostfixDomain(domain=domain_name, description=domain_descr) sess.add(newdomainadmin) sess.add(newdomain) sess.flush() return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
def editMailBox(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() errmess = None csrf = request.POST.get('csrf', '') access_user = sess.query(AccessEntity).filter_by(nick=str(request.user)).first() if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('postfix.cl.mail')) else: #get vars domain_name = request.POST.get('mbDomain', None) domain_descr = request.POST.get('mbDomainDescription', None) username = request.POST.get('mbUsername', None) mailbox_name = request.POST.get('mbName', None) mailbox_id = request.POST.get('id', None) domain_id = request.POST.get('did', None) mailbox_password = request.POST.get('mbPassword', None) if username: if username == access_user.nick: if mailbox_name and mailbox_password: mailbox = sess.query(PostfixMailbox).filter_by(id=int(mailbox_id)).first() mailbox.name = mailbox_name mailbox.password = mailbox_password mailbox.domain = domain_name else: domain = sess.query(PostfixDomain).filter_by(id=domain_id).first() domain.description = domain_descr sess.flush() return HTTPSeeOther(location=request.route_url('postfix.cl.mail'))
def create_record(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() csrf = request.POST.get('csrf', '') if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) else: #get fields related to obtained type and create corresponding fields rectype = request.POST.get('type', None) if rectype != "record" and rectype != "newdomain": #so we are creating some service, domain, mailserver, etc currentvalues = {} hostname = request.POST.get('hostName', None) currentvalues['name'] = hostname #check if we already have such domain name, #if so, return a warning111 #domain_clash = sess.query(func.count('*'))\ # .select_from(PDNSDomain)\ # .filter(PDNSDomain.name == hostname)\ # .scalar() #if domain_clash > 0: # request.session.flash({ # 'text' : loc.translate(_('Domain already exists, please add corresponding records manually')), # 'class' : 'danger' # }) # return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) #if no same domain name warinigs returned, we can continue processing our data #host record #domaintype = request.POST.get('hosttype', 'NATIVE') domainip = request.POST.get('hostValue', None) #if IP-address is not specified, raise a warning if not domainip: request.session.flash({ 'text' : loc.translate(_('You need to specify IP address')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) currentvalues['domainip'] = domainip #get the nameservers from the config ns1 = cfg.get('netprofile.client.pdns.ns1') ns2 = cfg.get('netprofile.client.pdns.ns2') currentvalues['nameserver1'] = ns1 currentvalues['nameserver2'] = ns2 currentvalues['ttl'] = 3600 currentvalues['prefix'] = '' currentvalues['name'] = hostname #and here we create our something. #as we have new service type, rectype, we can get all related fields newdomain = sess.query(PDNSDomain).filter(PDNSDomain.name==hostname).first() service_template = sess.query(PDNSTemplateType).filter(PDNSTemplateType.name==rectype).join(PDNSTemplate).all() #default values are stored as JSON in the database #if default value is a key of a dictionnary, lookup it's value in the currentvalues dict #else it is a complex value with prefix and value from currentvalues dict, as in jabber contents field #some examples: #Domain NS Record: {"ttl":"86400", "content":"nameserver2"} #Mailserver CNAME Record: {"ttl":"3600", "prefix":"mail", "content":"name"} #Jabber SRV Record: {"ttl":"3600", "prefix":"_xmpp-client._tcp", "content":["5 0 5222 jabber", "name"]} for t in service_template: for f in t.template_fields: defvalues = json.loads(f.defaultvalues) newname = currentvalues['name'] if 'prefix' in defvalues.keys(): newname = "{0}.{1}".format(defvalues['prefix'], newname) newrtype = f.field.name defcontent = defvalues.get('content', None) if defcontent: if not isinstance(defcontent, list): newcontent = currentvalues.get(defcontent, None) else: def_in_cur = [defcontent.index(k) for k in filter(lambda x: x in defcontent, currentvalues.keys())] for i in def_in_cur: defcontent[i] = currentvalues[defcontent[i]] newcontent =".".join(defcontent) else: newcontent = '' newttl = int(defvalues.get('ttl', 3600)) newRecord = PDNSRecord( domain = newdomain, name = newname, rtype = newrtype, content = newcontent, ttl = newttl, ) sess.add(newRecord) sess.flush() elif rectype == "record": ttl = None if request.POST.get('ttl', None) == '' else request.POST.get('ttl', None); prio = None if request.POST.get('prio', None) == '' else request.POST.get('prio', None); newrecord = PDNSRecord(domain_id=int(request.POST.get('domainid', None)), name=request.POST.get('name', None), rtype=request.POST.get('rtype', None), content=request.POST.get('content', None), ttl=ttl, prio=prio) sess.add(newrecord) sess.flush() elif rectype == "newdomain": hostname = request.POST.get('hostName', '127.0.0.1') hosttype = request.POST.get('hostType', 'NATIVE') domain_clash = sess.query(func.count('*'))\ .select_from(PDNSDomain)\ .filter(PDNSDomain.name == hostname)\ .scalar() if domain_clash > 0: request.session.flash({ 'text' : loc.translate(_('Domain already exists, please add corresponding records manually')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) newdomain = PDNSDomain( name=hostname, master='', dtype=hosttype, account=request.POST.get('user', None) ) sess.add(newdomain) sess.flush() return HTTPSeeOther(location=request.route_url('pdns.cl.domains', _query=(('created', 1),)))
def client_issue_new(ctx, req): loc = req.localizer cfg = req.registry.settings if not asbool(cfg.get('netprofile.client.ticket.enabled', True)): raise HTTPForbidden(detail=_('Issues view is disabled')) origin_id = int(cfg.get('netprofile.client.ticket.origin_id', 0)) user_id = int(cfg.get('netprofile.client.ticket.assign_uid', 0)) group_id = int(cfg.get('netprofile.client.ticket.assign_gid', 0)) errors = {} sess = DBSession() ent = req.user.parent states = sess.query(TicketState)\ .filter(TicketState.is_start == True, TicketState.allow_client == True) if 'submit' in req.POST: csrf = req.POST.get('csrf', '') name = req.POST.get('name', '') descr = req.POST.get('descr', '') state = int(req.POST.get('state', 0)) if csrf != req.get_csrf(): errors['csrf'] = _a('Error submitting form') else: l = len(name) if (l == 0) or (l > 254): errors['name'] = _a('Invalid field length') for s in states: if s.id == state: state = s break else: errors['state'] = _('Invalid issue type') if len(errors) == 0: tkt = Ticket() tkt.name = name tkt.state = state tkt.entity = ent tkt.show_client = True if descr: tkt.description = descr if origin_id: tkt.origin_id = origin_id if user_id: tkt.assigned_user_id = user_id if group_id: tkt.assigned_group_id = group_id sess.add(tkt) sess.flush() req.session.flash( {'text': loc.translate(_('New issue successfully created'))}) return HTTPSeeOther(location=req.route_url( 'tickets.cl.issues', traverse=(tkt.id, 'view'))) tpldef = { 'states': states, 'crumbs': [{ 'text': loc.translate(_('My Issues')), 'url': req.route_url('tickets.cl.issues', traverse=()) }, { 'text': loc.translate(_('New Issue')) }], 'errors': {err: loc.translate(errors[err]) for err in errors} } req.run_hook('access.cl.tpldef', tpldef, req) req.run_hook('access.cl.tpldef.issue.new', tpldef, req) return tpldef
def _wizcb_submit_hdl(wiz, em, step, act, val, req): xcls = cls if isinstance(xcls, str): xcls = _name_to_class(xcls) sess = DBSession() cfg = get_current_registry().settings mailer = get_mailer(req) userIDs = json.loads(val['userid']) userlist = val['user'] templateName = val['template'] templId = val['templid'] receiver = None sender = cfg.get('netprofile.mailing.sender', '*****@*****.**') sendername = cfg.get('sender.name', 'localadmin') mailhost = cfg.get('mail.host', 'localhost') for userid in userIDs: resvalue = {'userid' : userid} user = sess.query(AccessEntity).filter(AccessEntity.id==userid).first() subscr = sess.query(MailingSubscription).filter(MailingSubscription.userid==userid).first() #a long try-except statement to check if user is in mailing list try: if subscr.issubscribed is True: templateBody = sess.query(MailingTemplate).filter(MailingTemplate.id==templId).first().body resvalue['user'] = user resvalue['template'] = templateBody resvalue['templid'] = templId if user.parent: try: receiver = user.parent.email except AttributeError: #raise error here print("################### USER'S PARENT HAVE NO EMAIL ATTRIBUTE #######################") if receiver is not None: msg_text = Attachment(data=templateBody, content_type='text/plain; charset=\'utf-8\'', disposition='inline', transfer_encoding='quoted-printable' ) msg_html = Attachment(data=templateBody, content_type='text/html; charset=\'utf-8\'', disposition='inline', transfer_encoding='quoted-printable' ) message = Message( subject=(templateName), sender=sender, recipients=(receiver,), body=msg_text, html=msg_html ) mailer.send(message) resvalue['letteruid'] = hashlib.md5((templateBody + user.nick + str(datetime.datetime.now())).encode()).hexdigest() em = ExtModel(xcls) obj = xcls() em.set_values(obj, resvalue, req, True) sess.add(obj) sess.flush() else: print("################### USER HAVE NO EMAIL #######################") except AttributeError: print("########################## USER NOT IN SUBSCR LIST ###########################") return { 'do' : 'close', 'reload' : True }
def create_record(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() csrf = request.POST.get('csrf', '') if csrf != request.get_csrf(): request.session.flash({ 'text' : loc.translate(_('Error submitting form')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) else: rectype = request.POST.get('type', None) if rectype == "domain": name = request.POST.get('hostName', None) domain_clash = sess.query(func.count('*'))\ .select_from(PDNSDomain)\ .filter(PDNSDomain.name == name)\ .scalar() if domain_clash > 0: request.session.flash({ 'text' : loc.translate(_('Domain already exists')), 'class' : 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) ns1 = cfg.get('netprofile.client.pdns.ns1') ns2 = cfg.get('netprofile.client.pdns.ns2') newdomain = PDNSDomain(name=name, master='', dtype='NATIVE', account=request.POST.get('user', None)) newsoa = PDNSRecord() newsoa.domain = newdomain newsoa.name = name newsoa.rtype = 'SOA' newsoa.content = ns1 newsoa.ttl = 86400 newns1 = PDNSRecord() newns1.domain = newdomain newns1.name = name newns1.rtype = 'NS' newns1.content = ns1 newns1.ttl = 86400 newns2 = PDNSRecord() newns2.domain = newdomain newns2.name = name newns2.rtype = 'NS' newns2.content = ns2 newns2.ttl = 86400 sess.add(newdomain) sess.add(newsoa) sess.add(newns1) sess.add(newns2) sess.flush() elif rectype == "record": ttl = None if request.POST.get('ttl', None) == '' else request.POST.get('ttl', None); prio = None if request.POST.get('prio', None) == '' else request.POST.get('prio', None); newrecord = PDNSRecord(domain_id=int(request.POST.get('domainid', None)), name=request.POST.get('name', None), rtype=request.POST.get('rtype', None), content=request.POST.get('content', None), ttl=ttl, prio=prio) sess.add(newrecord) sess.flush() return HTTPSeeOther(location=request.route_url('pdns.cl.domains', _query=(('created', 1),)))
def client_issue_new(ctx, req): loc = req.localizer cfg = req.registry.settings if not asbool(cfg.get('netprofile.client.ticket.enabled', True)): raise HTTPForbidden(detail=_('Issues view is disabled')) origin_id = int(cfg.get('netprofile.client.ticket.origin_id', 0)) user_id = int(cfg.get('netprofile.client.ticket.assign_uid', 0)) group_id = int(cfg.get('netprofile.client.ticket.assign_gid', 0)) errors = {} sess = DBSession() ent = req.user.parent states = sess.query(TicketState)\ .filter(TicketState.is_start == True, TicketState.allow_client == True) if 'submit' in req.POST: csrf = req.POST.get('csrf', '') name = req.POST.get('name', '') descr = req.POST.get('descr', '') state = int(req.POST.get('state', 0)) if csrf != req.get_csrf(): errors['csrf'] = _a('Error submitting form') else: l = len(name) if (l == 0) or (l > 254): errors['name'] = _a('Invalid field length') for s in states: if s.id == state: state = s break else: errors['state'] = _('Invalid issue type') if len(errors) == 0: tkt = Ticket() tkt.name = name tkt.state = state tkt.entity = ent tkt.show_client = True if descr: tkt.description = descr if origin_id: tkt.origin_id = origin_id if user_id: tkt.assigned_user_id = user_id if group_id: tkt.assigned_group_id = group_id sess.add(tkt) sess.flush() req.session.flash({ 'text' : loc.translate(_('New issue successfully created')) }) return HTTPSeeOther(location=req.route_url('tickets.cl.issues', traverse=(tkt.id, 'view'))) tpldef = { 'states' : states, 'crumbs' : [{ 'text' : loc.translate(_('My Issues')), 'url' : req.route_url('tickets.cl.issues', traverse=()) }, { 'text' : loc.translate(_('New Issue')) }], 'errors' : {err: loc.translate(errors[err]) for err in errors} } req.run_hook('access.cl.tpldef', tpldef, req) req.run_hook('access.cl.tpldef.issue.new', tpldef, req) return tpldef
def create_record(request): loc = get_localizer(request) cfg = request.registry.settings sess = DBSession() csrf = request.POST.get('csrf', '') if csrf != request.get_csrf(): request.session.flash({ 'text': loc.translate(_('Error submitting form')), 'class': 'danger' }) return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) else: # get fields related to obtained type and create corresponding fields rectype = request.POST.get('type', None) if rectype != "record" and rectype != "newdomain": # so we are creating some service, domain, mailserver, etc currentvalues = {} hostname = request.POST.get('hostName', None) currentvalues['name'] = hostname # check if we already have such domain name, # if so, return a warning111 # domain_clash = sess.query(func.count('*'))\ # .select_from(PDNSDomain)\ # .filter(PDNSDomain.name == hostname)\ # .scalar() # if domain_clash > 0: # request.session.flash({ # 'text' : loc.translate(_('Domain already exists, please add corresponding records manually')), # 'class' : 'danger' # }) # return HTTPSeeOther(location=request.route_url('pdns.cl.domains')) # if no same domain name warinigs returned, we can continue processing our data # host record # domaintype = request.POST.get('hosttype', 'NATIVE') domainip = request.POST.get('hostValue', None) # if IP-address is not specified, raise a warning if not domainip: request.session.flash({ 'text': loc.translate( _('You need to specify IP address') ), 'class': 'danger' }) return HTTPSeeOther( location=request.route_url('pdns.cl.domains') ) currentvalues['domainip'] = domainip # get the nameservers from the config ns1 = cfg.get('netprofile.client.pdns.ns1') ns2 = cfg.get('netprofile.client.pdns.ns2') currentvalues['nameserver1'] = ns1 currentvalues['nameserver2'] = ns2 currentvalues['ttl'] = 3600 currentvalues['prefix'] = '' currentvalues['name'] = hostname # and here we create our something. # as we have new service type, rectype, we can get all related fields newdomain = sess.query(PDNSDomain).filter( PDNSDomain.name == hostname ).first() service_template = sess.query(PDNSTemplateType).filter( PDNSTemplateType.name == rectype ).join(PDNSTemplate).all() # default values are stored as JSON in the database # if default value is a key of a dictionnary, lookup it's value in the currentvalues dict # else it is a complex value with prefix and value from currentvalues dict, as in jabber contents field # some examples: # Domain NS Record: {"ttl":"86400", "content":"nameserver2"} # Mailserver CNAME Record: {"ttl":"3600", "prefix":"mail", "content":"name"} # Jabber SRV Record: {"ttl":"3600", "prefix":"_xmpp-client._tcp", "content":["5 0 5222 jabber", "name"]} for t in service_template: for f in t.template_fields: defvalues = json.loads(f.defaultvalues) newname = currentvalues['name'] if 'prefix' in defvalues.keys(): newname = "{0}.{1}".format( defvalues['prefix'], newname ) newrtype = f.field.name defcontent = defvalues.get('content', None) if defcontent: if not isinstance(defcontent, list): newcontent = currentvalues.get(defcontent, None) else: def_in_cur = [ defcontent.index(k) for k in filter( lambda x: x in defcontent, currentvalues.keys() ) ] for i in def_in_cur: defcontent[i] = currentvalues[defcontent[i]] newcontent = ".".join(defcontent) else: newcontent = '' newttl = int(defvalues.get('ttl', 3600)) newRecord = PDNSRecord( domain=newdomain, name=newname, rtype=newrtype, content=newcontent, ttl=newttl, ) sess.add(newRecord) sess.flush() elif rectype == "record": ttl = request.POST.get('ttl', None) if ttl == "": ttl = None prio = request.POST.get('prio', None) if prio == "": prio = None newrecord = PDNSRecord( domain_id=int(request.POST.get('domainid', None)), name=request.POST.get('name', None), rtype=request.POST.get('rtype', None), content=request.POST.get('content', None), ttl=ttl, prio=prio ) sess.add(newrecord) sess.flush() elif rectype == "newdomain": hostname = request.POST.get('hostName', '127.0.0.1') hosttype = request.POST.get('hostType', 'NATIVE') domain_clash = sess.query(func.count('*'))\ .select_from(PDNSDomain)\ .filter(PDNSDomain.name == hostname)\ .scalar() if domain_clash > 0: request.session.flash({ 'text': loc.translate( _('Domain already exists,' ' please add corresponding records manually') ), 'class': 'danger' }) return HTTPSeeOther( location=request.route_url('pdns.cl.domains') ) newdomain = PDNSDomain( name=hostname, master='', dtype=hosttype, account=request.POST.get('user', None) ) sess.add(newdomain) sess.flush() return HTTPSeeOther(location=request.route_url( 'pdns.cl.domains', _query=(('created', 1),) ))