def commands_group(self, id, item): itemType = 'stats' if item.has_key('ids') else 'insert' itemGroup = item['ids'] if itemType == 'stats' else None if itemType == 'insert': response = (dict( id=id )) if not isinstance(item['group'], DictType): raise ReceiverError('Value "group" must be dictonary type') if (not item['group'].get('id')): raise ReceiverError('Value "group" must be contains "id" field') else: item['group']['id'] = int(item['group']['id']) if 'status' in item['group'] and not item['group']['status'] in GROUP_STATUSES_NAMES: raise ReceiverError('Value "group" must be contains valid "status" field, values {0}'.format(GROUP_STATUSES.values())) # Check group group = groups.get(item['group']['id']) if group is None: # Insert group = Group.fromDict(dict(id=item['group'].pop('id'), **item['group'])) else: if 'status' in item['group']: # Update status groups.status(group.id, item['group']['status']) else: self.send(dict( error='Group already "{0}" exists'.format(group.id), id=itemId, )) response['group'] = (dict( id=groups.add(group), status=group.status, )) self.send(response) elif itemType == 'stats': itemGroup = (itemGroup,) if not isinstance(itemGroup, (TupleType, ListType)) else itemGroup itemGroup = map(int, itemGroup) self.send(dict( groups=dict(((group.id, group.toDict()) for group in map(groups.get, itemGroup) if group)), id=id, )) else: self.send(dict( error='Unknown type "{0}"'.format(itemType), id=itemId, ))
def commands_delete(self, id, item): itemType = None itemId = None itemForce = 'force' in item and item['force'] # Get type if 'group' in item: itemType = 'group' itemId = item['group'] elif 'message' in item: itemType = 'message' itemId = item['message'] else: raise ReceiverError('Unknown delete type, use "group, message"') response = (dict( id=id )) response[itemType] = itemId if itemType == 'group': # Check group group = groups.get(itemId) try: if group is None: # Group not found raise ReceiverError('Group "{0}" not found'.format(itemId)) if group.status != GROUP_STATUS_INACTIVE: # Group invalid status raise ReceiverError('Group "{0}" status must be "{1}"'.format(itemId, GROUP_STATUSES_NAMES[GROUP_STATUS_INACTIVE])) groups.delete(group.id) except ReceiverError, e: if not itemForce: # No skip raise e
def commands_mail(self, id, item): itemType = item.get('type', 'single') itemGroup = int(item.get('group')) if (item.has_key('group') and item['group']) else None response = (dict( counts = (dict( all=0, queued=0 )), id=id )) if itemType == 'single' or itemType == 'multiple': # Check if not 'to' in item: raise ReceiverError('Value "to" missing') if not isinstance(item['to'], (ListType, TupleType)): item['to'] = [item['to']] for to in item['to']: if not isinstance(to, DictType): raise ReceiverError('Value "to" must be dictonary type') if (not to['email']) or (not to['name']) or (int(to.get('priority', 0)) < 0): raise ReceiverError('Value "to" must have "email" and "name" fields') to['priority'] = min(QUEUE_MAX_PRIORITY, int(to.get('priority', 0))) to['priority'] = (-(to['priority'] - QUEUE_MAX_PRIORITY) + 1) if to['priority'] > 0 else 0 # Create parts if not 'parts' in to or not to['parts']: to['parts'] = dict() if not isinstance(to['parts'], DictType): raise ReceiverError('Value "parts" in "to" must be dictonary type') if 'delay' in to: if to['delay']: to['after'] = int(reactor.seconds() + to['delay']) # Clean del to['delay'] if not isinstance(item['message'], DictType): raise ReceiverError('Value "message" must be dictonary type') if not 'id' in item['message']: if (not item['message'].get('subject')): raise ReceiverError('Value "message" must be contains "subject" field') if (not item['message'].get('html')) and (not item['message'].get('text')): raise ReceiverError('Value "message" must be contains "html" and/or "text" fields') if (not item['message'].get('sender')): raise ReceiverError('Value "message" must be contains "sender" field') if not isinstance(item['message']['sender'], DictType): raise ReceiverError('Value "message" field "sender" must be dictonary type') if item['message'].get('headers') and not isinstance(item['message']['headers'], DictType): raise ReceiverError('Value "message" field "headers" must be dictonary type') messageId = item['message']['id'] if 'id' in item['message'] else None messageId = int(messageId) if messageId is not None else None # Create message if messageId is None: messageParams = dict(( )) # Add params if item['message'].get('headers'): messageParams['headers'] = item['message']['headers'] else: messageParams['headers'] = dict() # Clean if 'headers' in item['message']: del item['message']['headers'] message = Message.fromDict(dict(id=messages.id, **item['message'])) message.params = messageParams # Add to database messageId = messages.add(message) else: message = messages.get(messageId) if message is None: raise ReceiverError('Value "message" {0} not found'.format(messageId)) if itemGroup: # Check group group = groups.get(itemGroup) if group is None or group.status == GROUP_STATUS_INACTIVE: raise ReceiverError('Value "group" {0} not found or inactive'.format(itemGroup)) else: group = None for to in item['to']: to = To.fromDict(dict(id=tos.id, **to)) to.message = messageId if group is not None: to.group = group.id # Add to database toId = tos.add(to) # Counts response['counts']['all'] += 1 response['counts']['queued'] += 1 if response['counts']['queued'] > 0: # Update group if group is not None: group.all += response['counts']['queued'] group.wait += response['counts']['queued'] # Update message message.tos += response['counts']['queued'] self.send(response) else: self.send(dict( error='Unknown type "{0}"'.format(itemType), id=itemId, ))