diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 0c5c837e8eb2e69fc20443ff2e3b967e46f81e06..e8e49514f86f0a5432312033deaad405a5c268bc 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -161,9 +161,6 @@ class ContainerSerializer(LDListMixin, ListSerializer): def data(self): return ReturnDict(super(ListSerializer, self).data, serializer=self) - def create(self, validated_data): - return super().create(validated_data) - def to_internal_value(self, data): try: return super().to_internal_value(data[self.parent.url_field_name]) @@ -189,12 +186,6 @@ class JsonLdField(HyperlinkedRelatedField): except MultiValueDictKeyError: pass - def to_internal_value(self, data): - return super().to_internal_value(data) - - def get_value(self, dictionary): - return super().get_value(dictionary) - class JsonLdRelatedField(JsonLdField): def to_representation(self, value): @@ -238,9 +229,6 @@ class JsonLdIdentityField(JsonLdField): except KeyError: return super().to_internal_value(data) - def get_value(self, dictionary): - return super().get_value(dictionary) - def to_representation(self, value: Any) -> Any: '''returns hyperlink representation of identity field''' try: @@ -302,9 +290,6 @@ class LDPSerializer(HyperlinkedModelSerializer): return data - def build_field(self, field_name, info, model_class, nested_depth): - return super().build_field(field_name, info, model_class, nested_depth) - def build_property_field(self, field_name, model_class): class JSonLDPropertyField(ReadOnlyField): def to_representation(self, instance): diff --git a/djangoldp/tests/perf_result.csv b/djangoldp/tests/perf_result.csv new file mode 100644 index 0000000000000000000000000000000000000000..ee357b84d7f993cbf4bff93ce2374835003af059 --- /dev/null +++ b/djangoldp/tests/perf_result.csv @@ -0,0 +1,27 @@ +Machine,Date,Auth,volume,test+AF8-get+AF8-resource,test+AF8-get+AF8-container,test+AF8-get+AF8-filtered+AF8-fields,test+AF8-get+AF8-reverse+AF8-filtered+AF8-fields,test+AF8-get+AF8-nested +jbl+AC0-T440p,Sep 22 2020 10:50:51,False,200,0.003339644670486,0.006944504976273,0.038935685157776,0.024031536579132,0.000708421468735 +jbl+AC0-T440p,Sep 22 2020 10:51:46,False,200,0.0035072016716,0.006944673061371,0.039835988283157,0.025360778570175,0.000757339000702 +jbl+AC0-T440p,Sep 22 2020 10:52:42,False,200,0.003284044265747,0.006942090988159,0.038870732784271,0.023859632015228,0.000705161094666 +jbl+AC0-T440p,Sep 22 2020 10:53:16,False,100,0.003656179904938,0.005776383876801,0.025797350406647,0.01539302110672,0.000770201683044 +jbl+AC0-T440p,Sep 22 2020 10:53:33,False,100,0.003554759025574,0.005703027248383,0.024777753353119,0.015221126079559,0.000770528316498 +jbl+AC0-T440p,Sep 22 2020 10:53:49,False,100,0.003367004394531,0.005602278709412,0.023594326972962,0.014168989658356,0.000726828575134 +jbl+AC0-T440p,Sep 22 2020 10:54:03,False,50,0.003355793952942,0.005232772827148,0.016062431335449,0.009248399734497,0.000776686668396 +jbl+AC0-T440p,Sep 22 2020 10:54:09,False,50,0.003454508781433,0.005315055847168,0.016247057914734,0.009447617530823,0.00073832988739 +jbl+AC0-T440p,Sep 22 2020 10:54:15,False,50,0.003420171737671,0.005717425346375,0.016275815963745,0.009424614906311,0.001325125694275 +jbl+AC0-T440p,Sep 22 2020 10:57:41,False,300,0.003357520103455,0.009047945340474,0.055130259990692,0.033688295682271,0.000706691741943 +jbl+AC0-T440p,Sep 22 2020 10:59:35,False,300,0.003680046399434,0.009138919512431,0.056478141943614,0.0363059147199,0.000769446690877 +jbl+AC0-T440p,Sep 22 2020 11:01:29,False,300,0.003643860816956,0.008885918458303,0.059775860309601,0.035221153100332,0.000756018956502 +jbl+AC0-T440p,Sep 22 2020 11:47:40,False,100,0.003384988307953,0.006034939289093,0.024095425605774,0.014140074253082,0.000722093582153 +jbl+AC0-T440p,Sep 22 2020 11:47:57,False,100,0.003611071109772,0.005775241851807,0.023724327087402,0.014749829769135,0.000745611190796 +jbl+AC0-T440p,Sep 22 2020 11:48:15,False,100,0.003316740989685,0.005551462173462,0.023505146503449,0.014274184703827,0.000737235546112 +jbl+AC0-T440p,Sep 22 2020 11:51:06,False,200,0.003252120018005,0.006922056674957,0.038872839212418,0.025012502670288,0.000715854167938 +jbl+AC0-T440p,Sep 22 2020 11:52:07,False,200,0.003315222263336,0.007173013687134,0.039467182159424,0.0239526450634,0.000736322402954 +jbl+AC0-T440p,Sep 22 2020 11:53:59,False,200,0.003276619911194,0.006898198127747,0.038627609014511,0.023467609882355,0.000708512067795 +jbl-T440p,Sep 23 2020 11:42:20,True,100,0.0033536601066589357,0.005594186782836914,0.02409444808959961,0.014309453964233398,0.0007259154319763184 +jbl-T440p,Sep 23 2020 11:42:46,True,100,0.004463057518005371,0.005846123695373535,0.025511295795440675,0.019530348777770996,0.0008371376991271973 +jbl-T440p,Sep 23 2020 11:43:12,True,100,0.0032955718040466307,0.005650498867034912,0.023724429607391358,0.014459729194641113,0.000738534927368164 +jbl-T440p,Sep 23 2020 11:43:43,True,100,0.003489658832550049,0.005967645645141601,0.025534238815307617,0.015295367240905761,0.000775613784790039 +jbl-T440p,Sep 23 2020 11:44:47,True,200,0.0035008680820465088,0.007444144487380982,0.04217431545257568,0.027256717681884767,0.0007537198066711426 +jbl-T440p,Sep 23 2020 11:47:47,True,200,0.003582441806793213,0.007538770437240601,0.04289177656173706,0.027087905406951905,0.0007704663276672364 +jbl-T440p,Sep 23 2020 11:49:56,True,200,0.0036878740787506105,0.007823381423950195,0.04399535059928894,0.026256839036941527,0.0009590256214141846 +jbl-T440p,Sep 23 2020 11:51:40,True,200,0.003669688701629639,0.00750956654548645,0.04111528038978576,0.025184030532836913,0.0007782232761383057 diff --git a/djangoldp/tests/runner.py b/djangoldp/tests/runner.py index af89c6b874dac8a703ed4fcb1ea802455b4c0e23..10fa2129dda2a263c0dad05a9b12626a3f49e5df 100644 --- a/djangoldp/tests/runner.py +++ b/djangoldp/tests/runner.py @@ -25,7 +25,9 @@ failures = test_runner.run_tests([ 'djangoldp.tests.tests_pagination', 'djangoldp.tests.tests_inbox', 'djangoldp.tests.tests_backlinks_service', + 'djangoldp.tests.tests_perf_get' #'djangoldp.tests.tests_temp' + ]) if failures: sys.exit(failures) diff --git a/djangoldp/tests/settings_default.py b/djangoldp/tests/settings_default.py index 6ecb12a9129cab2b3adf3b5e017daa9fc5b2c5f2..10b0f9f0cc36c88c5c9e69d7af2648b6640de626 100644 --- a/djangoldp/tests/settings_default.py +++ b/djangoldp/tests/settings_default.py @@ -36,6 +36,7 @@ AUTH_USER_MODEL='tests.User' ANONYMOUS_USER_NAME = None MIDDLEWARE = [ + 'django_cookies_samesite.middleware.CookiesSameSite', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', diff --git a/djangoldp/tests/tests_perf_get.py b/djangoldp/tests/tests_perf_get.py new file mode 100644 index 0000000000000000000000000000000000000000..248ccab405f1a18c8484bbddd37d1dc65dcb939c --- /dev/null +++ b/djangoldp/tests/tests_perf_get.py @@ -0,0 +1,127 @@ +import datetime +import platform + +import time +from django.contrib.auth import get_user_model +from rest_framework.test import APIRequestFactory, APIClient, APITestCase +from statistics import mean, variance + +from djangoldp.tests.models import Post, Invoice, JobOffer, Skill, Batch, DateModel + + +class TestPerformanceGET(APITestCase): + posts = [] + skills = [] + jobs = [] + test_volume = 200 + result_line = [] + withAuth = True + + @classmethod + def setUpClass(cls): + super().setUpClass() + print("Init", end='', flush=True) + + step = cls.test_volume / 10 + cls.factory = APIRequestFactory() + cls.client = APIClient() + if cls.withAuth: + for i in range(cls.test_volume): + user = get_user_model().objects.create_user(username='john{}'.format(i), email='jlennon{}@beatles.com'.format(i), + password='glass onion') + cls.client.force_authenticate(user=user) + + for i in range(cls.test_volume): + cls.posts.append(Post.objects.create(content="content")) + + for i in range(cls.test_volume): + cls.skills.append(Skill.objects.create(title="Java", obligatoire="ok", slug=str(i))) + + for i in range(cls.test_volume): + job = JobOffer.objects.create(title="job", slug=str(i)) + for skill in cls.skills: + job.skills.add(skill) + if i % step == 0: + print(".", end='', flush=True) + job.save() + cls.jobs.append(job) + + cls.result_line.append(platform.node()) + cls.result_line.append(datetime.datetime.today().strftime("%b %d %Y %H:%M:%S")) + cls.result_line.append(cls.withAuth) + cls.result_line.append(cls.test_volume) + cls.result_line.append("N/A") + cls.result_line.append("N/A") + cls.result_line.append("N/A") + cls.result_line.append("N/A") + cls.result_line.append("N/A") + + @classmethod + def tearDownClass(cls): + import csv + with open('perf_result.csv', 'a', newline='') as csvfile: + writer = csv.writer(csvfile, delimiter=',', + quotechar='|', quoting=csv.QUOTE_MINIMAL) + writer.writerow(cls.result_line) + + def test_get_resource(self): + times = [] + + for post in self.posts: + start_time = time.time() + response = self.client.get('/posts/{}/'.format(post.pk), content_type='application/ld+json') + end_time = time.time() + times.append(end_time - start_time) + + self.result_line[4] = str(mean(times)) + print("Variance execution time :" + str(variance(times))) + + def test_get_container(self): + times = [] + + for post in self.posts: + start_time = time.time() + response = self.client.get('/posts/', content_type='application/ld+json') + end_time = time.time() + times.append(end_time - start_time) + + self.result_line[5] = str(mean(times)) + print("Variance execution time :" + str(variance(times))) + + def test_get_filtered_fields(self): + times = [] + + for job in self.jobs: + start_time = time.time() + response = self.client.get('/job-offers/{}/'.format(job.slug), content_type='application/ld+json') + end_time = time.time() + times.append(end_time - start_time) + + self.result_line[6] = str(mean(times)) + + print("Variance execution time :" + str(variance(times))) + + def test_get_reverse_filtered_fields(self): + times = [] + + for skill in self.skills: + start_time = time.time() + response = self.client.get('/skills/{}/'.format(skill.slug), content_type='application/ld+json') + end_time = time.time() + times.append(end_time - start_time) + + self.result_line[7] = str(mean(times)) + print("Variance execution time :" + str(variance(times))) + + def test_get_nested(self): + times = [] + + for job in self.jobs: + start_time = time.time() + response = self.client.get('/jobs/{}/skills'.format(job.slug), content_type='application/ld+json') + end_time = time.time() + times.append(end_time - start_time) + + self.result_line[8] = str(mean(times)) + print("Variance execution time :" + str(variance(times))) + diff --git a/djangoldp/views.py b/djangoldp/views.py index 545a6914a8775519927c4fe04cc0aee082e60098..ff5388b6753e96a06f8156d2753b4a7124d006d7 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -52,6 +52,7 @@ class JSONLDRenderer(JSONRenderer): data["@context"] = settings.LDP_RDF_CONTEXT return super(JSONLDRenderer, self).render(data, accepted_media_type, renderer_context) + # https://github.com/digitalbazaar/pyld class JSONLDParser(JSONParser): media_type = 'application/ld+json'