Skip to content

Commit 636e025

Browse files
authored
Merge pull request #73 from henilp105/main
fix: critical bug fixes and downloads stats
2 parents 9f7f35b + c292ddd commit 636e025

File tree

6 files changed

+55
-18
lines changed

6 files changed

+55
-18
lines changed

backend/models/package.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,15 @@ def from_json(json_data):
9797
)
9898

9999
class Version:
100-
def __init__(self, version, tarball, dependencies, created_at, is_deprecated, download_url, is_verified=False):
100+
def __init__(self, version, tarball, dependencies, created_at, oid , is_deprecated, download_url, is_verified=False):
101101
self.version = version
102102
self.tarball = tarball
103103
self.dependencies = dependencies
104104
self.created_at = created_at
105105
self.is_deprecated = is_deprecated
106106
self.download_url = download_url
107107
self.is_verified = is_verified
108+
self.oid = oid
108109

109110
# Create a to_json method.
110111
def to_json(self):
@@ -116,6 +117,7 @@ def to_json(self):
116117
"is_deprecated": self.is_deprecated,
117118
"download_url": self.download_url,
118119
"is_verified": self.is_verified,
120+
"oid": self.oid,
119121
}
120122

121123
# Create a from_json method.
@@ -129,4 +131,5 @@ def from_json(json_data):
129131
is_deprecated=json_data.get("is_deprecated"),
130132
download_url=json_data.get("download_url"),
131133
is_verified=json_data.get("is_verified"),
134+
oid=json_data.get("oid"),
132135
)

backend/packages.py

+43-12
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ def upload():
337337
dependencies="Test dependencies",
338338
created_at=datetime.utcnow(),
339339
is_deprecated=False,
340+
oid= file_object_id,
340341
download_url=f"/tarballs/{file_object_id}",
341342
)
342343

@@ -383,6 +384,7 @@ def upload():
383384
dependencies="Test dependencies",
384385
created_at=datetime.utcnow(),
385386
is_deprecated=False,
387+
oid = file_object_id,
386388
download_url=f"/tarballs/{file_object_id}",
387389
)
388390

@@ -444,16 +446,12 @@ def serve_gridfs_file(oid):
444446
try:
445447
file = file_storage.get(ObjectId(oid))
446448

447-
package_version_doc = db.packages.update_one(
448-
{
449-
"versions.oid": oid,
450-
},
449+
package_version_doc = db.tarballs.files.update_one(
450+
{"_id": ObjectId(oid)},
451451
{
452452
"$inc": {
453-
f"downloads_stats.versions.{oid}": 1,
454453
"downloads_stats.total_downloads": 1,
455-
f"downloads_stats.dates.{str(datetime.now())[:10]}.{oid}": 1,
456-
f"downloads_stats.dates.{str(datetime.now())[:10]}.total_downloads": 1,
454+
f"downloads_stats.dates.{str(datetime.now())[:10]}": 1,
457455
}
458456
},
459457
)
@@ -513,13 +511,46 @@ def get_package(namespace_name, package_name):
513511
ratings = 0
514512
rating_count = {}
515513

514+
# package_obj.downloads_stats Data Model
515+
# downloads_stats:
516+
# total_downloads:1
517+
# versions:
518+
# oid1:1
519+
# oid2:1
520+
# dates:
521+
# date1:
522+
# oid1:1
523+
# oid2:1
524+
# total_downloads:1
525+
526+
downloads_stats = dict()
527+
downloads_stats['versions'] = dict()
528+
downloads_stats['dates'] = dict()
529+
downloads_stats['total_downloads'] = 0
530+
try:
531+
for i in package_obj.versions:
532+
version_oid = db.tarballs.files.find_one({"_id": ObjectId(i.oid)})
533+
downloads_stats['versions'][str(i.oid)] = version_oid['downloads_stats']['total_downloads']
534+
downloads_stats['total_downloads'] += version_oid['downloads_stats']['total_downloads']
535+
for DATE_VALUE in version_oid['downloads_stats']['dates']:
536+
downloads_stats['dates'][DATE_VALUE] = dict()
537+
downloads_stats['dates'][DATE_VALUE][str(i.oid)] = version_oid['downloads_stats']['dates'][DATE_VALUE]
538+
for i in downloads_stats['dates']:
539+
downloads_stats['dates'][i]['total_downloads'] = sum(downloads_stats['dates'][i].values())
540+
except:
541+
downloads_stats = dict()
542+
516543
version_history = [{k: v for k, v in i.items() if k != 'tarball'} for i in package_obj.to_json()["versions"]]
544+
latest_version_data = package_obj.versions[-1].to_json()
545+
latest_version_data['oid'] = str(latest_version_data['oid'])
546+
for i in version_history:
547+
i['oid'] = str(i['oid'])
517548

518549
# Only latest version of the package will be sent as a response.
519550
package_response_data = {
520551
"name": package_obj.name,
521552
"namespace": namespace_obj.namespace,
522-
"latest_version_data": package_obj.versions[-1].to_json(),
553+
"latest_version_data": latest_version_data,
523554
"author": package_author_obj.username,
524555
"keywords": package_obj.keywords if package_obj.keywords else [],
525556
"categories": package_obj.categories if package_obj.categories else [],
@@ -529,10 +560,9 @@ def get_package(namespace_name, package_name):
529560
"updated_at": package_obj.updated_at,
530561
"description": package_obj.description,
531562
"ratings": ratings,
532-
"downloads": package_obj.downloads_stats,
563+
"downloads": downloads_stats,
533564
"ratings_count": rating_count
534565
}
535-
536566
return jsonify({"data": package_response_data, "code": 200})
537567

538568

@@ -617,7 +647,8 @@ def get_package_from_version(namespace_name, package_name, version):
617647
version_data = next(
618648
filter(lambda obj: obj.version == version, version_history), None
619649
)
620-
650+
version_history = version_data.to_json()
651+
version_history['oid'] = str(version_history['oid'])
621652
# Only queried version should be sent as response.
622653
package_response_data = {
623654
"name": package_obj.name,
@@ -627,7 +658,7 @@ def get_package_from_version(namespace_name, package_name, version):
627658
"categories": package_obj.categories,
628659
"license": package_obj.license,
629660
"created_at": package_obj.created_at,
630-
"version_data": version_data.to_json(),
661+
"version_data": version_history,
631662
"updatedAt": package_obj.updated_at,
632663
"description": package_obj.description,
633664
}

backend/requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ semantic-version
1010
docker
1111
toml
1212
flask-jwt-extended
13+
numpy

backend/tests/test_packages.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ def test_get_existing_package_version(self):
321321
f"/packages/{self.test_namespace_data['namespace']}/{self.test_package_data['package_name']}/0.0.1"
322322
)
323323

324-
self.assertEqual(200, response.json["code"]) # TODO: Check after fixing : get_package_from_version 608
324+
self.assertEqual(200, response.json["code"])
325325
print("test_get_existing_package_version passed")
326326

327327
def test_package_invalid_license(self):

backend/validate.py

+1
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ def validate() -> None:
151151
update_data[k] = f"{k} not provided."
152152

153153
db.packages.update_one({"name": package['name'],"namespace":package['namespace']}, {"$set": update_data})
154+
print(f"Package {packagename} verified successfully.")
154155

155156

156157
validate()

frontend/src/pages/package.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ const PackagePage = () => {
8282
v{data.latest_version_data.version} Published{" "}
8383
{updatedDays(data.updated_at)} days ago
8484
</p>
85+
<p>
86+
</p>
8587
<MDBTabs className="mb-3">
8688
<MDBTabsItem>
8789
<MDBTabsLink
@@ -252,10 +254,9 @@ const ViewPackageMaintainersButton = ({
252254
const sideBar = (data, setShowReportForm) => {
253255
return (
254256
<MDBCol size="3">
255-
<p style={{ fontSize: 16, textAlign: "left" }}>Install</p>
256-
<code>
257-
fpm install {data.namespace}/{data.name}
258-
</code>
257+
<p style={{ fontSize: 16, textAlign: "left" }}>Install (add to fpm.toml)</p>
258+
<p style={{ fontSize: 14, textAlign: "left" }}><code>{data.name} = {"{"}{"'namespace'"}: {"'"}{data.namespace}{"'}"}</code> </p>
259+
<hr></hr>
259260
<p style={{ fontSize: 16, textAlign: "left" }}>Repository</p>
260261
<Container> {data.repository}</Container>
261262
<hr></hr>

0 commit comments

Comments
 (0)