Navigation Menu

Skip to content

Commit

Permalink
Refactored ajax.py tag method to work with only one object. Fixes kiw…
Browse files Browse the repository at this point in the history
  • Loading branch information
asankov committed Feb 20, 2018
1 parent 15eee14 commit 0bd844b
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 83 deletions.
103 changes: 34 additions & 69 deletions tcms/core/ajax.py
Expand Up @@ -11,7 +11,6 @@

from django import http
from django.db.models import Q
from django.db.utils import IntegrityError
from django.contrib.auth.models import User
from django.core import serializers
from django.core.exceptions import ObjectDoesNotExist
Expand All @@ -30,12 +29,10 @@
from tcms.testcases.models import TestCase, Bug
from tcms.testcases.models import Category
from tcms.testcases.models import TestCaseStatus
from tcms.testcases.views import get_selected_testcases
from tcms.testcases.views import plan_from_request_or_none
from tcms.testplans.models import TestPlan, TestCasePlan
from tcms.testruns.models import TestRun, TestCaseRun, TestCaseRunStatus
from tcms.core.helpers.comments import add_comment
from tcms.core.utils import string_to_list
from tcms.core.utils.validations import validate_bug_id


Expand Down Expand Up @@ -190,105 +187,73 @@ class Objects(object):
__all__ = ['plan', 'case', 'run']

def __init__(self, request, template_name):
self.request = request
self.template_name = template_name
for o in self.__all__:
if request.GET.get(o):
self.object = o
self.object_pks = request.GET.getlist(o)
for obj in self.__all__:
if request.GET.get(obj):
self.object = obj
self.object_pk = request.GET.get(obj)
break

def get(self):
func = getattr(self, self.object)
return func()

def plan(self):
return self.template_name, TestPlan.objects.filter(
pk__in=self.object_pks)
return self.template_name, TestPlan.objects.get(
pk=self.object_pk)

def case(self):
return self.template_name, get_selected_testcases(self.request)
return self.template_name, TestCase.objects.get(
pk=self.object_pk)

def run(self):
self.template_name = 'run/get_tag.html'
return self.template_name, TestRun.objects.filter(
pk__in=self.object_pks)
return 'run/get_tag.html', TestRun.objects.get(
pk=self.object_pk)

class TagActions(object):
__all__ = ['add', 'remove']

def __init__(self, obj, tag):
self.obj = obj
self.tag = string_to_list(tag)
self.request = request
self.tag = tag

def add(self):
for tag_str in self.tag:
try:
tag, c = Tag.objects.get_or_create(name=tag_str)
for o in self.obj:
o.add_tag(tag)
except IntegrityError:
return "Error when adding %s " \
"Tag with this key already exists in the database." % self.tag
except Exception:
return "Error when adding %s" % self.tag

return True, self.obj
tag, _ = Tag.objects.get_or_create(name=self.tag)
self.obj.add_tag(tag)

def remove(self):
self.obj = self.obj.filter(tag__name__in=self.tag).distinct()

if not self.obj:
return "Tags does not exist in current selected plan."

for tag_str in self.tag:
try:
tag = Tag.objects.filter(name=tag_str)[0]
except IndexError:
return "Tag %s does not exist in current selected plan." % tag_str
for object in self.obj:
try:
object.remove_tag(tag)
except Exception:
return "Remove tag %s error." % tag
return True, self.obj
tag = Tag.objects.get(name=self.tag)
self.obj.remove_tag(tag)

objects = Objects(request, template_name)
template_name, obj = objects.get()

q_tag = request.GET.get('tags')
q_action = request.GET.get('a')

if q_action:
tag_actions = TagActions(obj=obj, tag=q_tag)
func = getattr(tag_actions, q_action)
response = func()
if not response[0]:
return HttpResponse(json.dumps({'response': response, 'rc': 1}))
getattr(tag_actions, q_action)()

del q_tag, q_action

# Response the single operation
if len(obj) == 1:
tags = obj[0].tag.all()
tags = tags.extra(select={
'num_plans':
'SELECT COUNT(*) FROM test_plan_tags '
'WHERE test_tags.tag_id = test_plan_tags.tag_id',
'num_cases':
'SELECT COUNT(*) FROM test_case_tags '
'WHERE test_tags.tag_id = test_case_tags.tag_id',
'num_runs':
'SELECT COUNT(*) FROM test_run_tags '
'WHERE test_tags.tag_id = test_run_tags.tag_id',
})

context_data = {
'tags': tags,
'object': obj[0],
}
return render(request, template_name, context_data)
return HttpResponse('')
tags = obj.tag.all()
tags = tags.extra(select={
'num_plans':
'SELECT COUNT(*) FROM test_plan_tags '
'WHERE test_tags.tag_id = test_plan_tags.tag_id',
'num_cases':
'SELECT COUNT(*) FROM test_case_tags '
'WHERE test_tags.tag_id = test_case_tags.tag_id',
'num_runs':
'SELECT COUNT(*) FROM test_run_tags '
'WHERE test_tags.tag_id = test_run_tags.tag_id',
})
context_data = {
'tags': tags,
'object': obj,
}
return render(request, template_name, context_data)


def get_value_by_type(val, v_type):
Expand Down
72 changes: 58 additions & 14 deletions tcms/core/tests/test_ajax.py
Expand Up @@ -98,7 +98,7 @@ def test_update_default_tester_non_existing_user(self):
self._assert_default_tester_is(None)


class Test_Tag_Add(test.TestCase):
class Test_Tag_Test(test.TestCase):

@classmethod
def setUpTestData(cls):
Expand All @@ -108,6 +108,9 @@ def setUpTestData(cls):
cls.test_case = TestCaseFactory()
cls.test_run = TestRunFactory()


class Test_Tag_Add(Test_Tag_Test):

def test_add_tag_to_test_plan(self):
response = self.client.get(self.url, {
'tags': self.test_tag,
Expand Down Expand Up @@ -142,21 +145,11 @@ def test_add_tag_to_test_run(self):
self.assertTrue(self.test_tag in self.test_run.tag.all())


class Test_Tag_Remove(test.TestCase):

@classmethod
def setUpTestData(cls):
cls.url = reverse('ajax-tags')
cls.test_tag = TagFactory()
cls.test_plan = TestPlanFactory()
cls.test_case = TestCaseFactory()
cls.test_run = TestRunFactory()

cls.test_plan.add_tag(cls.test_tag)
cls.test_case.add_tag(cls.test_tag)
cls.test_run.add_tag(cls.test_tag)
class Test_Tag_Remove(Test_Tag_Test):

def test_remove_tag_from_test_plan(self):
self.test_plan.add_tag(self.test_tag)

response = self.client.get(self.url, {
'tags': self.test_tag,
'plan': self.test_plan.plan_id,
Expand All @@ -167,6 +160,8 @@ def test_remove_tag_from_test_plan(self):
self.assertEqual(self.test_plan.tag.count(), 0)

def test_remove_tag_from_test_case(self):
self.test_case.add_tag(self.test_tag)

response = self.client.get(self.url, {
'tags': self.test_tag,
'case': self.test_case.case_id,
Expand All @@ -177,6 +172,8 @@ def test_remove_tag_from_test_case(self):
self.assertEqual(self.test_case.tag.count(), 0)

def test_remove_tag_from_test_run(self):
self.test_run.add_tag(self.test_tag)

response = self.client.get(self.url, {
'tags': self.test_tag,
'run': self.test_run.run_id,
Expand All @@ -185,3 +182,50 @@ def test_remove_tag_from_test_run(self):

self.assertEqual(response.status_code, http.client.OK)
self.assertEqual(self.test_run.tag.count(), 0)


class Test_Tag_Render(Test_Tag_Test):

@classmethod
def setUpTestData(cls):
super(Test_Tag_Render, cls).setUpTestData()

cls.test_plan.add_tag(cls.test_tag)
cls.test_case.add_tag(cls.test_tag)
cls.test_run.add_tag(cls.test_tag)

for _ in range(0, 3):
TestPlanFactory().add_tag(cls.test_tag)

for _ in range(0, 4):
TestCaseFactory().add_tag(cls.test_tag)

for _ in range(0, 5):
TestRunFactory().add_tag(cls.test_tag)

def test_render_plan(self):
response = self.client.get(self.url, {
'plan': self.test_plan.plan_id
})

self._assert_tags(response)

def test_render_case(self):
response = self.client.get(self.url, {
'case': self.test_case.case_id
})

self._assert_tags(response)

def _assert_tags(self, response):
self.assertEqual(response.status_code, http.client.OK)

# asserting the number of tags for the given plan/case/run
self.assertEqual(self.test_plan.tag.count(), 1)
self.assertEqual(self.test_case.tag.count(), 1)
self.assertEqual(self.test_run.tag.count(), 1)

# asserting the number or plans/cases/runs the tag has been assigned to
self.assertContains(response, '>4</a>')
self.assertContains(response, '>5</a>')
self.assertContains(response, '>6</a>')

0 comments on commit 0bd844b

Please sign in to comment.