Example #1
0
class TestDetail(amo.tests.TestCase):

    def setUp(self):
        self.webapp = Webapp(name='woo', app_slug='yeah')
        self.webapp.save()

    def test_more_url(self):
        response = self.client.get(self.webapp.get_url_path())
        eq_(pq(response.content)('#more-webpage').attr('data-more-url'),
            self.webapp.get_url_path(more=True))
Example #2
0
    def test_app_slug_collision(self):
        Webapp(app_slug='slug').save()
        w2 = Webapp(app_slug='slug')
        w2.save()
        eq_(w2.app_slug, 'slug-1')

        w3 = Webapp(app_slug='slug')
        w3.save()
        eq_(w3.app_slug, 'slug-2')
Example #3
0
def queue_counts(type=None, **kw):
    def construct_query(query_type, days_min=None, days_max=None):
        def apply_query(query, *args):
            query = query.having(*args)
            return query

        query = query_type.objects

        if days_min:
            query = apply_query(query, 'waiting_time_days >=', days_min)
        if days_max:
            query = apply_query(query, 'waiting_time_days <=', days_max)

        return query.count

    counts = {'pending': construct_query(ViewPendingQueue, **kw),
              'nominated': construct_query(ViewFullReviewQueue, **kw),
              'prelim': construct_query(ViewPreliminaryQueue, **kw),
              'moderated': Review.objects.filter(reviewflag__isnull=False,
                                                 editorreview=1).count,
              'apps': Webapp.pending().count}
    rv = {}
    if isinstance(type, basestring):
        return counts[type]()
    for k, v in counts.items():
        if not isinstance(type, list) or k in type:
            rv[k] = v()
    return rv
Example #4
0
def verify_app_domain(manifest_url):
    if settings.WEBAPPS_UNIQUE_BY_DOMAIN:
        domain = Webapp.domain_from_url(manifest_url)
        if Addon.objects.filter(app_domain=domain).exists():
            raise forms.ValidationError(
                _('An app already exists on this domain, '
                  'only one app per domain is allowed.'))
Example #5
0
def queue_counts(type=None, **kw):
    def construct_query(query_type, days_min=None, days_max=None):
        def apply_query(query, *args):
            query = query.having(*args)
            return query

        query = query_type.objects

        if days_min:
            query = apply_query(query, 'waiting_time_days >=', days_min)
        if days_max:
            query = apply_query(query, 'waiting_time_days <=', days_max)

        return query.count

    counts = {
        'pending':
        construct_query(ViewPendingQueue, **kw),
        'nominated':
        construct_query(ViewFullReviewQueue, **kw),
        'prelim':
        construct_query(ViewPreliminaryQueue, **kw),
        'moderated':
        Review.objects.filter(reviewflag__isnull=False, editorreview=1).count,
        'apps':
        Webapp.pending().count
    }
    rv = {}
    if isinstance(type, basestring):
        return counts[type]()
    for k, v in counts.items():
        if not isinstance(type, list) or k in type:
            rv[k] = v()
    return rv
Example #6
0
def verify_app_domain(manifest_url):
    if settings.WEBAPPS_UNIQUE_BY_DOMAIN:
        domain = Webapp.domain_from_url(manifest_url)
        if Addon.objects.filter(app_domain=domain).exists():
            raise forms.ValidationError(
                _('An app already exists on this domain, '
                  'only one app per domain is allowed.'))
Example #7
0
def app_search(request, template=None):
    form = ESSearchForm(request.GET or {}, type=amo.ADDON_WEBAPP)
    form.is_valid()  # Let the form try to clean data.
    query = form.cleaned_data
    qs = (Webapp.search().query(or_=name_query(query['q']))
          .filter(type=amo.ADDON_WEBAPP, status=amo.STATUS_PUBLIC,
                  is_disabled=False)
          .facet(tags={'terms': {'field': 'tag'}},
                 categories={'terms': {'field': 'category', 'size': 100}}))
    if query.get('tag'):
        qs = qs.filter(tag=query['tag'])
    if query.get('cat'):
        qs = qs.filter(category=query['cat'])
    if query.get('sort'):
        mapping = {'downloads': '-weekly_downloads',
                   'rating': '-bayesian_rating',
                   'created': '-created',
                   'name': '-name_sort',
                   'hotness': '-hotness'}
        qs = qs.order_by(mapping[query['sort']])

    pager = amo.utils.paginate(request, qs)
    facets = pager.object_list.facets

    ctx = {
        'pager': pager,
        'query': query,
        'form': form,
        'sorting': sort_sidebar(request, query, form),
        'categories': category_sidebar(request, query, facets),
        'tags': tag_sidebar(request, query, facets),
    }
    return jingo.render(request, template, ctx)
Example #8
0
def app_search(request, tag_name=None, template=None):
    form = ESSearchForm(request.GET.copy() or {}, type=amo.ADDON_WEBAPP)
    form.is_valid()  # Let the form try to clean data.
    query = form.cleaned_data
    # TODO(apps): We should figure out if we really want tags for apps.
    if tag_name:
        query['tag'] = tag_name

    qs = (Webapp.search().filter(type=amo.ADDON_WEBAPP,
                                 status=amo.STATUS_PUBLIC,
                                 is_disabled=False).facet(
                                     tags={'terms': {
                                         'field': 'tag'
                                     }},
                                     categories={
                                         'terms': {
                                             'field': 'category',
                                             'size': 200
                                         }
                                     }))

    filters = ['cat', 'price', 'sort', 'tag']
    mapping = {
        'downloads': '-weekly_downloads',
        'rating': '-bayesian_rating',
        'created': '-created',
        'name': 'name_sort',
        'hotness': '-hotness',
        'price': 'price'
    }
    qs = _filter_search(request, qs, query, filters, mapping,
                        [amo.ADDON_WEBAPP])

    pager = amo.utils.paginate(request, qs)
    facets = pager.object_list.facets

    sort, extra_sort = split_choices(form.sort_choices, 'price')

    ctx = {
        'is_pjax': request.META.get('HTTP_X_PJAX'),
        'pager': pager,
        'query': query,
        'form': form,
        'sorting': sort_sidebar(request, query, form),
        'sort_opts': sort,
        'extra_sort_opts': extra_sort,
        'sort': query.get('sort'),
        'webapp': True,
    }
    if not ctx['is_pjax']:
        ctx.update({
            'prices': price_sidebar(request, query, facets),
            'categories': category_sidebar(request, query, facets),
            'tags': tag_sidebar(request, query, facets),
        })
    return jingo.render(request, template, ctx)
Example #9
0
def app_search(request, tag_name=None, template=None):
    form = ESSearchForm(request.GET.copy() or {}, type=amo.ADDON_WEBAPP)
    form.is_valid()  # Let the form try to clean data.
    query = form.cleaned_data
    # TODO(apps): We should figure out if we really want tags for apps.
    if tag_name:
        query["tag"] = tag_name

    qs = (
        Webapp.search()
        .filter(type=amo.ADDON_WEBAPP, status=amo.STATUS_PUBLIC, is_disabled=False)
        .facet(tags={"terms": {"field": "tag"}}, categories={"terms": {"field": "category", "size": 200}})
    )

    filters = ["cat", "price", "sort", "tag"]
    mapping = {
        "downloads": "-weekly_downloads",
        "rating": "-bayesian_rating",
        "created": "-created",
        "name": "name_sort",
        "hotness": "-hotness",
        "price": "price",
    }
    qs = _filter_search(request, qs, query, filters, mapping, [amo.ADDON_WEBAPP])

    pager = amo.utils.paginate(request, qs)
    facets = pager.object_list.facets

    sort, extra_sort = split_choices(form.sort_choices, "price")

    ctx = {
        "is_pjax": request.META.get("HTTP_X_PJAX"),
        "pager": pager,
        "query": query,
        "form": form,
        "sorting": sort_sidebar(request, query, form),
        "sort_opts": sort,
        "extra_sort_opts": extra_sort,
        "sort": query.get("sort"),
        "webapp": True,
    }
    if not ctx["is_pjax"]:
        ctx.update(
            {
                "prices": price_sidebar(request, query, facets),
                "categories": category_sidebar(request, query, facets),
                "tags": tag_sidebar(request, query, facets),
            }
        )
    return jingo.render(request, template, ctx)
Example #10
0
    def test_app_slug_collision(self):
        Webapp(app_slug="slug").save()
        w2 = Webapp(app_slug="slug")
        w2.save()
        eq_(w2.app_slug, "slug-1")

        w3 = Webapp(app_slug="slug")
        w3.save()
        eq_(w3.app_slug, "slug-2")
Example #11
0
    def test_app_slug_collision(self):
        Webapp(app_slug='slug').save()
        w2 = Webapp(app_slug='slug')
        w2.save()
        eq_(w2.app_slug, 'slug-1')

        w3 = Webapp(app_slug='slug')
        w3.save()
        eq_(w3.app_slug, 'slug-2')
Example #12
0
def app_search(request, tag_name=None, template=None):
    form = ESSearchForm(request.GET.copy() or {}, type=amo.ADDON_WEBAPP)
    form.is_valid()  # Let the form try to clean data.
    query = form.cleaned_data
    # TODO(apps): We should figure out if we really want tags for apps.
    if tag_name:
        query['tag'] = tag_name

    qs = (Webapp.search()
          .filter(type=amo.ADDON_WEBAPP, status=amo.STATUS_PUBLIC,
                  is_disabled=False)
          .facet(tags={'terms': {'field': 'tag'}},
                 categories={'terms': {'field': 'category', 'size': 200}}))

    filters = ['cat', 'price', 'sort', 'tag']
    mapping = {'downloads': '-weekly_downloads',
               'rating': '-bayesian_rating',
               'created': '-created',
               'name': 'name_sort',
               'hotness': '-hotness',
               'price': 'price'}
    qs = _filter_search(request, qs, query, filters, mapping,
                        [amo.ADDON_WEBAPP])

    pager = amo.utils.paginate(request, qs)
    facets = pager.object_list.facets

    sort, extra_sort = split_choices(form.sort_choices, 'price')

    ctx = {
        'is_pjax': request.META.get('HTTP_X_PJAX'),
        'pager': pager,
        'query': query,
        'form': form,
        'sorting': sort_sidebar(request, query, form),
        'sort_opts': sort,
        'extra_sort_opts': extra_sort,
        'sort': query.get('sort'),
        'webapp': True,
    }
    if not ctx['is_pjax']:
        ctx.update({
            'prices': price_sidebar(request, query, facets),
            'categories': category_sidebar(request, query, facets),
            'tags': tag_sidebar(request, query, facets),
        })
    return jingo.render(request, template, ctx)
Example #13
0
def app_search(request, template=None):
    form = ESSearchForm(request.GET or {}, type=amo.ADDON_WEBAPP)
    form.is_valid()  # Let the form try to clean data.
    query = form.cleaned_data
    qs = (Webapp.search().query(or_=name_query(query['q'])).filter(
        type=amo.ADDON_WEBAPP, status=amo.STATUS_PUBLIC,
        is_disabled=False).facet(
            tags={'terms': {
                'field': 'tag'
            }},
            categories={'terms': {
                'field': 'category',
                'size': 100
            }}))
    if query.get('tag'):
        qs = qs.filter(tag=query['tag'])
    if query.get('cat'):
        qs = qs.filter(category=query['cat'])
    if query.get('sort'):
        mapping = {
            'downloads': '-weekly_downloads',
            'rating': '-bayesian_rating',
            'created': '-created',
            'name': '-name_sort',
            'hotness': '-hotness'
        }
        qs = qs.order_by(mapping[query['sort']])

    pager = amo.utils.paginate(request, qs)
    facets = pager.object_list.facets

    ctx = {
        'is_pjax': request.META.get('HTTP_X_PJAX'),
        'pager': pager,
        'query': query,
        'form': form,
        'sorting': sort_sidebar(request, query, form),
        'sort_opts': form.fields['sort'].choices,
    }
    if not ctx['is_pjax']:
        ctx.update({
            'categories': category_sidebar(request, query, facets),
            'tags': tag_sidebar(request, query, facets),
        })
    return jingo.render(request, template, ctx)
Example #14
0
def app_search(request, template=None):
    form = ESSearchForm(request.GET or {}, type=amo.ADDON_WEBAPP)
    form.is_valid()  # Let the form try to clean data.
    query = form.cleaned_data
    qs = (
        Webapp.search()
        .query(or_=name_query(query["q"]))
        .filter(type=amo.ADDON_WEBAPP, status=amo.STATUS_PUBLIC, is_disabled=False)
        .facet(tags={"terms": {"field": "tag"}}, categories={"terms": {"field": "category", "size": 100}})
    )
    if query.get("tag"):
        qs = qs.filter(tag=query["tag"])
    if query.get("cat"):
        qs = qs.filter(category=query["cat"])
    if query.get("sort"):
        mapping = {
            "downloads": "-weekly_downloads",
            "rating": "-bayesian_rating",
            "created": "-created",
            "name": "-name_sort",
            "hotness": "-hotness",
        }
        qs = qs.order_by(mapping[query["sort"]])

    pager = amo.utils.paginate(request, qs)
    facets = pager.object_list.facets

    ctx = {
        "pager": pager,
        "query": query,
        "form": form,
        "sorting": sort_sidebar(request, query, form),
        "categories": category_sidebar(request, query, facets),
        "tags": tag_sidebar(request, query, facets),
    }
    return jingo.render(request, template, ctx)
Example #15
0
 def test_webapp_type(self):
     webapp = Webapp()
     webapp.save()
     eq_(webapp.type, amo.ADDON_WEBAPP)
Example #16
0
 def test_none(self):
     Webapp.domain_from_url(None)
Example #17
0
 def test_subdomains(self):
     eq_(Webapp.domain_from_url('http://apps.mozilla.com/'),
         'apps.mozilla.com')
Example #18
0
 def test_normalize_www(self):
     eq_(Webapp.domain_from_url('http://www.mozilla.com/super/rad.webapp'),
         'mozilla.com')
Example #19
0
 def test_simple(self):
     eq_(Webapp.domain_from_url('http://mozilla.com/'), 'mozilla.com')
Example #20
0
 def test_app_slugs_separate_from_addon_slugs(self):
     Addon.objects.create(type=1, slug='slug')
     webapp = Webapp(app_slug='slug')
     webapp.save()
     eq_(webapp.slug, 'app-%s' % webapp.id)
     eq_(webapp.app_slug, 'slug')
Example #21
0
 def test_app_slug_blocklist(self):
     BlacklistedSlug.objects.create(name='slug')
     w = Webapp(app_slug='slug')
     w.save()
     eq_(w.app_slug, 'slug~')
Example #22
0
 def test_reviewed(self):
     assert not Webapp().is_unreviewed()
Example #23
0
 def can_be_purchased(self):
     assert Webapp(premium_type=True).can_be_purchased()
     assert not Webapp(premium_type=False).can_be_purchased()
Example #24
0
 def test_get_origin(self):
     url = 'http://www.xx.com:4000/randompath/manifest.webapp'
     webapp = Webapp(manifest_url=url)
     eq_(webapp.origin, 'http://www.xx.com:4000')
Example #25
0
 def test_get_url_path_more(self):
     webapp = Webapp(app_slug='woo')
     eq_(webapp.get_url_path(more=True), '/en-US/apps/app/woo/more')
Example #26
0
 def test_get_url_path(self):
     webapp = Webapp(app_slug='woo')
     eq_(webapp.get_url_path(), '/en-US/apps/app/woo/')
Example #27
0
 def test_with_port(self):
     eq_(Webapp.domain_from_url('http://mozilla.com:9000/'), 'mozilla.com')
Example #28
0
 def test_webapp_type(self):
     webapp = Webapp()
     webapp.save()
     eq_(webapp.type, amo.ADDON_WEBAPP)
Example #29
0
 def test_get_url_path(self):
     webapp = Webapp(app_slug='woo')
     eq_(webapp.get_url_path(), '/en-US/apps/app/woo/')
Example #30
0
 def test_empty(self):
     Webapp.domain_from_url('')
Example #31
0
 def test_https(self):
     eq_(Webapp.domain_from_url('https://mozilla.com/'), 'mozilla.com')
Example #32
0
 def test_get_url_path_more(self):
     webapp = Webapp(app_slug="woo")
     eq_(webapp.get_url_path(more=True), "/en-US/apps/app/woo/more")
Example #33
0
 def test_subdomains(self):
     eq_(Webapp.domain_from_url('http://apps.mozilla.com/'),
         'apps.mozilla.com')
Example #34
0
class WebappTest(amo.tests.TestCase):
    def setUp(self):
        self.webapp = Webapp(name="woo", app_slug="yeah")
        self.webapp.save()
        self.url = self.webapp.get_url_path()
Example #35
0
 def test_long_path(self):
     eq_(Webapp.domain_from_url('http://mozilla.com/super/rad.webapp'),
         'mozilla.com')
Example #36
0
 def setUp(self):
     self.webapp = Webapp(name="woo", app_slug="yeah")
     self.webapp.save()
     self.url = self.webapp.get_url_path()
Example #37
0
 def test_with_port(self):
     eq_(Webapp.domain_from_url('http://mozilla.com:9000/'), 'mozilla.com')
Example #38
0
 def test_mark_done_pending(self):
     w = Webapp()
     eq_(w.status, amo.STATUS_NULL)
     w.mark_done()
     eq_(w.status, amo.STATUS_PENDING)
Example #39
0
 def test_https(self):
     eq_(Webapp.domain_from_url('https://mozilla.com/'), 'mozilla.com')
Example #40
0
 def test_has_icon_in_manifest(self, get_manifest_json):
     webapp = Webapp()
     get_manifest_json.return_value = {}
     eq_(webapp.has_icon_in_manifest(), False)
Example #41
0
 def test_empty(self):
     Webapp.domain_from_url('')
Example #42
0
 def test_normalize_www(self):
     eq_(Webapp.domain_from_url('http://www.mozilla.com/super/rad.webapp'),
         'mozilla.com')
Example #43
0
 def test_app_slugs_separate_from_addon_slugs(self):
     Addon.objects.create(type=1, slug='slug')
     webapp = Webapp(app_slug='slug')
     webapp.save()
     eq_(webapp.slug, 'app-%s' % webapp.id)
     eq_(webapp.app_slug, 'slug')
Example #44
0
 def test_none(self):
     Webapp.domain_from_url(None)
Example #45
0
 def test_app_slug_blocklist(self):
     BlacklistedSlug.objects.create(name='slug')
     w = Webapp(app_slug='slug')
     w.save()
     eq_(w.app_slug, 'slug~')
Example #46
0
def queue_apps(request):
    qs = Webapp.pending().annotate(Count('abuse_reports'))
    return _queue(request, WebappQueueTable, 'apps', qs=qs)
Example #47
0
 def test_get_url_path_more(self):
     webapp = Webapp(app_slug='woo')
     eq_(webapp.get_url_path(more=True), '/en-US/apps/app/woo/more')
Example #48
0
 def test_simple(self):
     eq_(Webapp.domain_from_url('http://mozilla.com/'), 'mozilla.com')
Example #49
0
 def test_mark_done_public(self):
     w = Webapp()
     eq_(w.status, amo.STATUS_NULL)
     w.mark_done()
     eq_(w.status, amo.STATUS_PUBLIC)
Example #50
0
def queue_apps(request):
    qs = Webapp.pending().annotate(Count('abuse_reports'))
    return _queue(request, WebappQueueTable, 'apps', qs=qs)
Example #51
0
 def test_has_icon_in_manifest(self, get_manifest_json):
     webapp = Webapp()
     get_manifest_json.return_value = {'icons': {}}
     eq_(webapp.has_icon_in_manifest(), True)
Example #52
0
 def test_long_path(self):
     eq_(Webapp.domain_from_url('http://mozilla.com/super/rad.webapp'),
         'mozilla.com')