Adding pre_save to the bulk actions

remotes/origin/enhancement/email-actions
Jesús Espino 2014-08-11 20:19:38 +02:00
parent d9246b1ec0
commit 2817b3b120
9 changed files with 22 additions and 14 deletions

View File

@ -43,7 +43,7 @@ def reload_attribute(model_instance, attr_name):
@transaction.atomic @transaction.atomic
def save_in_bulk(instances, callback=None, **save_options): def save_in_bulk(instances, callback=None, precall=None, **save_options):
"""Save a list of model instances. """Save a list of model instances.
:params instances: List of model instances. :params instances: List of model instances.
@ -53,16 +53,20 @@ def save_in_bulk(instances, callback=None, **save_options):
if callback is None: if callback is None:
callback = functions.identity callback = functions.identity
if precall is None:
precall = functions.identity
for instance in instances: for instance in instances:
if instance.pk is None: if instance.pk is None:
created = True created = True
precall(instance)
instance.save(**save_options) instance.save(**save_options)
callback(instance, created=True) callback(instance, created=True)
@transaction.atomic @transaction.atomic
def update_in_bulk(instances, list_of_new_values, callback=None): def update_in_bulk(instances, list_of_new_values, callback=None, precall=None):
"""Update a list of model instances. """Update a list of model instances.
:params instances: List of model instances. :params instances: List of model instances.
@ -71,10 +75,13 @@ def update_in_bulk(instances, list_of_new_values, callback=None):
""" """
if callback is None: if callback is None:
callback = functions.identity callback = functions.identity
if precall is None:
precall = functions.identity
for instance, new_values in zip(instances, list_of_new_values): for instance, new_values in zip(instances, list_of_new_values):
for attribute, value in new_values.items(): for attribute, value in new_values.items():
setattr(instance, attribute, value) setattr(instance, attribute, value)
precall(instance)
instance.save() instance.save()
callback(instance) callback(instance)

View File

@ -188,7 +188,8 @@ class MembershipViewSet(ModelCrudViewSet):
project = models.Project.objects.get(id=data["project_id"]) project = models.Project.objects.get(id=data["project_id"])
self.check_permissions(request, 'bulk_create', project) self.check_permissions(request, 'bulk_create', project)
members = services.create_members_in_bulk( members = services.create_members_in_bulk(
data["bulk_memberships"], project=project, callback=self.post_save) data["bulk_memberships"], project=project, callback=self.post_save,
precall=self.pre_save)
members_serialized = self.serializer_class(members, many=True) members_serialized = self.serializer_class(members, many=True)
return response.Ok(data=members_serialized.data) return response.Ok(data=members_serialized.data)

View File

@ -165,7 +165,7 @@ class IssueViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin,
data["bulk_issues"], project=project, owner=request.user, data["bulk_issues"], project=project, owner=request.user,
status=project.default_issue_status, severity=project.default_severity, status=project.default_issue_status, severity=project.default_severity,
priority=project.default_priority, type=project.default_issue_type, priority=project.default_priority, type=project.default_issue_type,
callback=self.post_save) callback=self.post_save, precall=self.pre_save)
issues_serialized = self.serializer_class(issues, many=True) issues_serialized = self.serializer_class(issues, many=True)
return response.Ok(data=issues_serialized.data) return response.Ok(data=issues_serialized.data)

View File

@ -31,7 +31,7 @@ def get_issues_from_bulk(bulk_data, **additional_fields):
for line in text.split_in_lines(bulk_data)] for line in text.split_in_lines(bulk_data)]
def create_issues_in_bulk(bulk_data, callback=None, **additional_fields): def create_issues_in_bulk(bulk_data, callback=None, precall=None, **additional_fields):
"""Create issues from `bulk_data`. """Create issues from `bulk_data`.
:param bulk_data: List of issues in bulk format. :param bulk_data: List of issues in bulk format.
@ -41,7 +41,7 @@ def create_issues_in_bulk(bulk_data, callback=None, **additional_fields):
:return: List of created `Issue` instances. :return: List of created `Issue` instances.
""" """
issues = get_issues_from_bulk(bulk_data, **additional_fields) issues = get_issues_from_bulk(bulk_data, **additional_fields)
db.save_in_bulk(issues, callback) db.save_in_bulk(issues, callback, precall)
return issues return issues

View File

@ -19,7 +19,7 @@ def get_members_from_bulk(bulk_data, **additional_fields):
return members return members
def create_members_in_bulk(bulk_data, callback=None, **additional_fields): def create_members_in_bulk(bulk_data, callback=None, precall=None, **additional_fields):
"""Create members from `bulk_data`. """Create members from `bulk_data`.
:param bulk_data: List of dicts `{"project_id": <>, "role_id": <>, "email": <>}`. :param bulk_data: List of dicts `{"project_id": <>, "role_id": <>, "email": <>}`.
@ -29,5 +29,5 @@ def create_members_in_bulk(bulk_data, callback=None, **additional_fields):
:return: List of created `Member` instances. :return: List of created `Member` instances.
""" """
members = get_members_from_bulk(bulk_data, **additional_fields) members = get_members_from_bulk(bulk_data, **additional_fields)
db.save_in_bulk(members, callback) db.save_in_bulk(members, callback, precall)
return members return members

View File

@ -70,7 +70,7 @@ class TaskViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin,
tasks = services.create_tasks_in_bulk( tasks = services.create_tasks_in_bulk(
data["bulk_tasks"], milestone_id=data["sprint_id"], user_story_id=data["us_id"], data["bulk_tasks"], milestone_id=data["sprint_id"], user_story_id=data["us_id"],
status_id=data.get("status_id") or project.default_task_status_id, status_id=data.get("status_id") or project.default_task_status_id,
project=project, owner=request.user, callback=self.post_save) project=project, owner=request.user, callback=self.post_save, precall=self.pre_save)
tasks_serialized = self.serializer_class(tasks, many=True) tasks_serialized = self.serializer_class(tasks, many=True)
return response.Ok(tasks_serialized.data) return response.Ok(tasks_serialized.data)

View File

@ -31,7 +31,7 @@ def get_tasks_from_bulk(bulk_data, **additional_fields):
for line in text.split_in_lines(bulk_data)] for line in text.split_in_lines(bulk_data)]
def create_tasks_in_bulk(bulk_data, callback=None, **additional_fields): def create_tasks_in_bulk(bulk_data, callback=None, precall=None, **additional_fields):
"""Create tasks from `bulk_data`. """Create tasks from `bulk_data`.
:param bulk_data: List of tasks in bulk format. :param bulk_data: List of tasks in bulk format.
@ -41,5 +41,5 @@ def create_tasks_in_bulk(bulk_data, callback=None, **additional_fields):
:return: List of created `Task` instances. :return: List of created `Task` instances.
""" """
tasks = get_tasks_from_bulk(bulk_data, **additional_fields) tasks = get_tasks_from_bulk(bulk_data, **additional_fields)
db.save_in_bulk(tasks, callback) db.save_in_bulk(tasks, callback, precall)
return tasks return tasks

View File

@ -73,7 +73,7 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi
user_stories = services.create_userstories_in_bulk( user_stories = services.create_userstories_in_bulk(
data["bulk_stories"], project=project, owner=request.user, data["bulk_stories"], project=project, owner=request.user,
status_id=data.get("status_id") or project.default_us_status_id, status_id=data.get("status_id") or project.default_us_status_id,
callback=self.post_save) callback=self.post_save, precall=self.pre_save)
user_stories_serialized = self.serializer_class(user_stories, many=True) user_stories_serialized = self.serializer_class(user_stories, many=True)
return response.Ok(user_stories_serialized.data) return response.Ok(user_stories_serialized.data)
return response.BadRequest(serializer.errors) return response.BadRequest(serializer.errors)

View File

@ -33,7 +33,7 @@ def get_userstories_from_bulk(bulk_data, **additional_fields):
for line in text.split_in_lines(bulk_data)] for line in text.split_in_lines(bulk_data)]
def create_userstories_in_bulk(bulk_data, callback=None, **additional_fields): def create_userstories_in_bulk(bulk_data, callback=None, precall=None, **additional_fields):
"""Create user stories from `bulk_data`. """Create user stories from `bulk_data`.
:param bulk_data: List of user stories in bulk format. :param bulk_data: List of user stories in bulk format.
@ -43,7 +43,7 @@ def create_userstories_in_bulk(bulk_data, callback=None, **additional_fields):
:return: List of created `Task` instances. :return: List of created `Task` instances.
""" """
userstories = get_userstories_from_bulk(bulk_data, **additional_fields) userstories = get_userstories_from_bulk(bulk_data, **additional_fields)
db.save_in_bulk(userstories, callback) db.save_in_bulk(userstories, callback, precall)
return userstories return userstories