From 7af2d983393281932653808d50cc8f20aabbbd2c Mon Sep 17 00:00:00 2001 From: Sudipto Baral Date: Thu, 18 Aug 2022 21:08:42 +0600 Subject: [PATCH] [#14] feature: installed python-dateutils --- Pipfile | 1 + Pipfile.lock | 26 +++++++++++++++++++++----- app/models/user.py | 15 ++++++++++++++- app/services/cf_response_parser.py | 1 + setup.cfg | 6 ++++-- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Pipfile b/Pipfile index 772dc89..f3b4db2 100644 --- a/Pipfile +++ b/Pipfile @@ -11,6 +11,7 @@ pytest = "*" pybadges = "*" pytest-mock = "*" mock = "*" +python-dateutil = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 6fa3462..9eb6edf 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "685f5cf19e208e3893c99bf8efba05130586a2db929afc05e2c3842d36a31f37" + "sha256": "68b01298527144826e44fc973225730f49d98d7a3fe6fd7d6f8b49979dd7d2a5" }, "pipfile-spec": 6, "requires": { @@ -29,7 +29,7 @@ "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d", "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==2022.6.15" }, "charset-normalizer": { @@ -37,7 +37,7 @@ "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5", "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==2.1.0" }, "idna": { @@ -122,7 +122,7 @@ "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==21.3" }, "pluggy": { @@ -130,7 +130,7 @@ "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==1.0.0" }, "py": { @@ -214,6 +214,14 @@ "index": "pypi", "version": "==3.8.2" }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "index": "pypi", + "version": "==2.8.2" + }, "python-dotenv": { "hashes": [ "sha256:b7e3b04a59693c42c36f9ab1cc2acc46fa5df8c78e178fc33a8d4cd05c8d498f", @@ -230,6 +238,14 @@ "index": "pypi", "version": "==2.28.1" }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, "tomli": { "hashes": [ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", diff --git a/app/models/user.py b/app/models/user.py index e0fb0f8..d248742 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -1,3 +1,8 @@ +from datetime import datetime + +import dateutil.relativedelta + + class User: """Singleton user model.""" name: str = '' @@ -12,6 +17,7 @@ class User: wrong_ans: int = 0 tle: int = 0 contributions: int = 0 + registration_unix_time: int = 0 def __new__(cls): if not hasattr(cls, 'instance'): @@ -47,10 +53,17 @@ def rating_color(self): def max_rating_color(self): return self.__get_color(self.max_rating) + @property + def member_since(self): + """Returns the number of years at codeforces.""" + joined_at = datetime.fromtimestamp(self.registration_unix_time) + rd = dateutil.relativedelta.relativedelta(datetime.now(), joined_at) + return int(rd.years) + def __str__(self): """Returns the string rep of the class.""" return f"Name: {self.name}\nOrg: {self.organization}\nRating: {self.rating}\n" + \ f"Rank: {self.rank}\nMax Rating: {self.max_rating}\nMax Rank: {self.max_rank}\n" + \ f"Contests: {self.contests}\nSubmissions: {self.submissions}\nAC: {self.accepted}\n" + \ - f"WA: {self.wrong_ans}\nTLE: {self.tle}\nContribution: {self.contributions}\n" + f"WA: {self.wrong_ans}\nTLE: {self.tle}\nContribution: {self.contributions}\nSince: {self.member_since}" diff --git a/app/services/cf_response_parser.py b/app/services/cf_response_parser.py index d71250c..062ac20 100644 --- a/app/services/cf_response_parser.py +++ b/app/services/cf_response_parser.py @@ -26,6 +26,7 @@ def _parse_user_info(cls, user_info): user.max_rating = user_info.get('maxRating', 0) user.max_rank = user_info.get('maxRank', 'newbie') user.contributions = user_info.get('contributions', 0) + user.registration_unix_time = user_info.get('registrationTimeSeconds', 0) @classmethod def _parse_user_submission(cls, user_submission): diff --git a/setup.cfg b/setup.cfg index 1409adb..83e0ed1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,6 +35,7 @@ install_requires = iniconfig==1.1.1 Jinja2==3.1.2 MarkupSafe==2.1.1 + mock==4.0.3 packaging==21.3 pluggy==1.0.0 py==1.11.0 @@ -42,14 +43,15 @@ install_requires = pydantic==1.9.2 pyparsing==3.0.9 pytest==7.1.2 + pytest-mock==3.8.2 + python-dateutil==2.8.2 python-dotenv==0.20.0 requests==2.28.1 + six==1.16.0 tomli==2.0.1 typing_extensions==4.3.0 urllib3==1.26.11 - - [options.packages.find] where =