def add(actor, type_desc, **kwargs): type, subtype = type_desc action = Action(actor=actor, type=type, subtype=subtype, **kwargs) # can this be DRY-ed somehow? # ----- global ----- if action.action_object: if hasattr(action.action_object, "name"): action.action_object_cache = action.action_object.name elif hasattr(action.action_object, "username"): action.action_object_cache = action.action_object.username elif hasattr(action.action_object, "value"): # rating action.action_object_cache = str(action.action_object.value) if action.target: if hasattr(action.target, "name"): action.target_cache = action.target.name elif hasattr(action.target, "username"): action.target_cache = action.target.username elif action.target._meta.app_label == 'solution' and action.target._meta.module_name == 'solution': data = [ action.target.author_id, action.target.author.username, action.target.task_id, action.target.task.name, action.target.task.author_id, ] # 250 chars should be enough for this action.target_cache = POST_SEND_CACHE_SEPARATOR.join([xss.escape(unicode(x)) for x in data]) # ----- type specific ----- if type == POST_SEND: T = action.action_object.content.text action.action_object_cache = T[:78] + '...' if len(T) > 80 else T action.save()