Index: appengine/chromium_rietveld/codereview/views.py |
diff --git a/appengine/chromium_rietveld/codereview/views.py b/appengine/chromium_rietveld/codereview/views.py |
index 1b08651d9a52b214d394242b2ca253704db979e3..7489e5d28bb50a4c2e5cee87913a833c257da9f4 100644 |
--- a/appengine/chromium_rietveld/codereview/views.py |
+++ b/appengine/chromium_rietveld/codereview/views.py |
@@ -78,6 +78,7 @@ from oauth2client import xsrfutil |
from codereview import auth_utils |
from codereview import buildbucket |
+from codereview import dependency_utils |
from codereview import engine |
from codereview import library |
from codereview import models |
@@ -181,6 +182,7 @@ class UploadForm(forms.Form): |
base = forms.CharField(max_length=MAX_URL, required=False) |
target_ref = forms.CharField(max_length=MAX_URL, required=False) |
cq_dry_run = forms.BooleanField(required=False) |
+ depends_on_patchset = forms.CharField(required=False) |
data = forms.FileField(required=False) |
issue = forms.IntegerField(required=False) |
reviewers = forms.CharField(max_length=MAX_REVIEWERS, required=False) |
@@ -1024,6 +1026,26 @@ def edit_patchset_title(request): |
return HttpResponse('OK', content_type='text/plain') |
+@deco.access_control_allow_origin_star |
+@deco.require_methods('POST') |
+@deco.patchset_required |
+@deco.json_response |
+def get_depends_on_patchset(request): |
+ """/<issue>/get_depends_on_patchset- The patchset this patchset depends on.""" |
+ response = {} |
+ if request.patchset.depends_on_patchset: |
+ # Verify that the depended upon issue is not closed. |
+ tokens = dependency_utils.get_dependency_tokens( |
+ request.patchset.depends_on_patchset) |
+ depends_on_issue = models.Issue.get_by_id(int(tokens[0])) |
+ if depends_on_issue and not depends_on_issue.closed: |
+ response = { |
+ 'issue': tokens[0], |
+ 'patchset': tokens[1], |
+ } |
+ return response |
+ |
+ |
@deco.admin_required |
@deco.user_key_required |
@deco.xsrf_required |
@@ -1437,8 +1459,13 @@ def _make_new(request, form): |
first_ps_id, _ = models.PatchSet.allocate_ids(1, parent=issue.key) |
ps_key = ndb.Key(models.PatchSet, first_ps_id, parent=issue.key) |
+ depends_on_patchset = ( |
+ dependency_utils.mark_as_dependent_and_get_dependency_str( |
+ form.cleaned_data.get('depends_on_patchset'), issue.key.id(), |
+ ps_key.id())) |
patchset = models.PatchSet( |
- issue_key=issue.key, data=data, url=url, key=ps_key) |
+ issue_key=issue.key, data=data, url=url, key=ps_key, |
+ depends_on_patchset=depends_on_patchset) |
patchset.put() |
if not separate_patches: |
@@ -1532,8 +1559,14 @@ def _add_patchset_from_form(request, issue, form, message_key='message', |
message = form.cleaned_data[message_key] |
first_id, _ = models.PatchSet.allocate_ids(1, parent=issue.key) |
ps_key = ndb.Key(models.PatchSet, first_id, parent=issue.key) |
+ |
+ depends_on_patchset = ( |
+ dependency_utils.mark_as_dependent_and_get_dependency_str( |
+ form.cleaned_data.get('depends_on_patchset'), issue.key.id(), |
+ ps_key.id())) |
patchset = models.PatchSet( |
- issue_key=issue.key, message=message, data=data, url=url, key=ps_key) |
+ issue_key=issue.key, message=message, data=data, url=url, key=ps_key, |
+ depends_on_patchset=depends_on_patchset) |
patchset.put() |
if not separate_patches: |
@@ -2057,6 +2090,11 @@ def _delete_cached_contents(patch_list): |
def delete(request): |
"""/<issue>/delete - Delete an issue. There is no way back.""" |
issue = request.issue |
+ # Update the dependents to remove dependency on this issue. |
+ dependency_utils.remove_dependencies_from_all_patchsets(issue) |
+ # Remove this issue as a dependent. |
+ dependency_utils.remove_all_patchsets_as_dependents(issue) |
+ |
tbd = [issue] |
for cls in [models.PatchSet, models.Patch, models.Comment, |
models.Message, models.Content, models.TryJobResult]: |
@@ -2083,6 +2121,10 @@ def delete_patchset(request): |
patchset_num, request.patchset.key.id()) |
make_message(request, request.issue, delete_msg, send_mail=False, |
auto_generated=True).put() |
+ # Update all dependents of this patchset. |
+ dependency_utils.remove_dependencies(request.patchset) |
+ # Remove this patchset as a dependent. |
+ dependency_utils.remove_as_dependent(request.patchset) |
# Delete the patchset. |
request.patchset.nuke() |
return HttpResponseRedirect(reverse(show, args=[request.issue.key.id()])) |
@@ -2370,6 +2412,8 @@ def _patchset_as_dict(patchset, comments, try_jobs, request): |
'created': str(patchset.created), |
'modified': str(patchset.modified), |
'num_comments': patchset.num_comments, |
+ 'depends_on_patchset': patchset.depends_on_patchset, |
+ 'dependent_patchsets': patchset.dependent_patchsets, |
'files': {}, |
} |
if (try_jobs): |