diff --git a/tests/unit/cli/search/test_reindex.py b/tests/unit/cli/search/test_reindex.py index 6bba0bca6e4b..1edf5dcc1e61 100644 --- a/tests/unit/cli/search/test_reindex.py +++ b/tests/unit/cli/search/test_reindex.py @@ -42,6 +42,7 @@ def test_project_docs(db_session): "name": p.name, "normalized_name": p.normalized_name, "version": [r.version for r in prs], + "downloads": p.downloads, }, } for p, prs in sorted(releases.items(), key=lambda x: x[0].name.lower()) diff --git a/tests/unit/packaging/test_search.py b/tests/unit/packaging/test_search.py index 0be16583c22c..1218e3b61da6 100644 --- a/tests/unit/packaging/test_search.py +++ b/tests/unit/packaging/test_search.py @@ -27,6 +27,7 @@ def test_build_search(): pretend.stub(version="3.0"), pretend.stub(version="4.0"), ], + downloads=9001, ), summary="This is my summary", description="This is my description", diff --git a/warehouse/packaging/models.py b/warehouse/packaging/models.py index 875a9130b0e0..e34cb9c5c6e9 100644 --- a/warehouse/packaging/models.py +++ b/warehouse/packaging/models.py @@ -13,6 +13,7 @@ import enum from collections import OrderedDict +from datetime import datetime from citext import CIText from pyramid.security import Allow @@ -153,6 +154,12 @@ def documentation_url(self): return request.route_url("legacy.docs", project=self.name) + @property + def downloads(self): + release, *_ = self.releases + delta = (datetime.now() - release.created).days or 1 + return release.downloads / delta + class DependencyKind(enum.IntEnum): @@ -339,6 +346,10 @@ def urls(self): def has_meta(self): return any([self.keywords]) + @property + def downloads(self): + return sum([file_.downloads for file_ in self.files]) + class File(db.Model): diff --git a/warehouse/packaging/search.py b/warehouse/packaging/search.py index 8604a14cecda..60879a2003eb 100644 --- a/warehouse/packaging/search.py +++ b/warehouse/packaging/search.py @@ -10,7 +10,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from elasticsearch_dsl import DocType, String, analyzer, MetaField, Date +from elasticsearch_dsl import ( + DocType, String, analyzer, MetaField, Date, Float +) from warehouse.search import doc_type @@ -47,6 +49,7 @@ class Project(DocType): platform = String(index="not_analyzed") created = Date() classifiers = String(index="not_analyzed", multi=True) + downloads = Float() class Meta: # disable the _all field to save some space @@ -70,5 +73,6 @@ def from_db(cls, release): obj["platform"] = release.platform obj["created"] = release.created obj["classifiers"] = list(release.classifiers) + obj["downloads"] = release.project.downloads return obj diff --git a/warehouse/templates/search/results.html b/warehouse/templates/search/results.html index a529e32b91db..c1a38aff09f3 100644 --- a/warehouse/templates/search/results.html +++ b/warehouse/templates/search/results.html @@ -148,6 +148,7 @@