Example #1
0
 def count(self):
     return QuerySet.count(self)
     count = cache.get(self._get_cache_key('count'))
     if count is None:
         count = int(QuerySet.count(self))
         cache.set(self._get_cache_key('count'), count, self.cache_timeout)
     return count
Example #2
0
 def count(self):
     return QuerySet.count(self)
     count = cache.get(self._get_cache_key('count'))
     if count is None:
         count = int(QuerySet.count(self))
         cache.set(self._get_cache_key('count'), count, self.cache_timeout)
     return count
Example #3
0
def test_contacts_list(admin_client: Client, contacts: QuerySet):
    """Should return a list of contacts."""
    response = admin_client.get(reverse("contacts-list"))

    assert response.status_code == 200
    assert response.accepted_media_type == "application/json"
    assert response.json()["count"] == contacts.count()
Example #4
0
def test_category_list(client: Client, categories: QuerySet):
    """Should return a list of categories."""
    response = client.get(reverse("categories-list"))

    assert response.status_code == 200
    assert response.accepted_media_type == "application/json"
    assert response.json()["count"] == categories.count()
Example #5
0
def _set_base_amount_contributed(orders: QuerySet):
    """
    Sets base amount contributed in orders.
    """

    logging.info('Total non-base-amount-contributed orders: {}'.format(
        orders.count()))

    try:
        orderbook_contract = load_contract(
            MAINNET_ORDERBOOK_ABI,
            w3.toChecksumAddress(MAINNET_ORDERBOOK_ADDRESS),
        )

        for counter, order in enumerate(orders):
            order_hash = order.memo_contract
            order_is_base_raised = orderbook_contract.functions.baseRaised(
                order_hash).call()

            order.base_amount_contributed = order_is_base_raised
            order.save()

            logging.info('{}. Order updated: {}'.format(counter, order.id))
    except Exception as exception_error:
        logging.error('Exception: {}'.format(exception_error))

        return 0

    return 1
Example #6
0
 def reactivate(self, request: HttpRequest, queryset: QuerySet) -> None:
     """Reactivate all selected Visitor objects."""
     count = queryset.count()
     for obj in queryset:
         obj.reactivate()
     self.message_user(
         request, f"{count} passes have been activated.", messages.SUCCESS
     )
    def render(self, name, value, attrs=None):
        if value is None:
            value = ""

        display = ""
        if self.url:
            url = self.url
            display = self.initial_display

        else:
            dc, dc, query = pickle.loads(_simple_autocomplete_queryset_cache[self.token])
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteWidget, self).render(name, value, attrs)
            else:
                url = reverse("simple-autocomplete", args=[self.token])
                fieldname = get_search_fieldname(self.model)
                if value:
                    display = getattr(queryset.get(pk=value), fieldname)

            html = """
    <script type="text/javascript">
    $(document).ready(function(){

    $("#id_%(name)s_helper").autocomplete({
        source: function(request, response){
            $.ajax({
                url: "%(url)s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                },
                dataType: "json"
            });
        },
        select: function(event, ui) { $('#id_%(name)s').val(ui.item.real_value); },
        minLength: 3
    });

    });
    </script>

<input id="id_%(name)s_helper" type="text" value="%(display)s" />
<a href="#" title="Clear" onclick="$('#id_%(name)s_helper').val(''); $('#id_%(name)s').val(''); return false;">x<small></small></a>
<input name="%(name)s" id="id_%(name)s" type="hidden" value="%(value)s" />""" % dict(
                name=name, url=url, display=display, value=value
            )
            return mark_safe(html)
Example #8
0
def test_review_manager_get_user_list(
    user: User,
    reviews: QuerySet,
):
    """Should return a professional list filtered by a the user."""
    assert reviews.count() == 2
    result = Review.objects.get_user_list(user)
    assert result.count() == 1
    assert result.first().professional.user == user
Example #9
0
 def assertCopied(self, original, site):
     """Assert that the model was copied to the new site."""
     # Use the QuerySet to get around the forced site filter when using the CurrentSiteManager
     copied = QuerySet(original.__class__).filter(slug=original.slug, site=site)
     self.assertTrue(copied.exists())
     self.assertEqual(copied.count(), 1)
     self.assertTrue(copied.exists())
     copy = copied[0]
     self.assertNotEqual(copy.pk, original.pk)
Example #10
0
 def admiss_reverse(self, request, queryset: QuerySet):
     try:
         for obj in queryset:
             r = ResumeResult.objects.get(resume=obj)
             r.admiss = False
             r.save()
         self.message_user(
             request, '将{}份简历取消录取'.format(queryset.count()), messages.SUCCESS)
     except Exception as e:
         self.message_user(request, e.__str__(), messages.ERROR)
Example #11
0
def test_subcategory_list(client: Client, subcategories: QuerySet):
    """Should return a list of subcategories."""
    subcat = subcategories.first()
    response = client.get(reverse("subcategories-list"))

    assert response.status_code == 200
    assert response.accepted_media_type == "application/json"
    assert response.json()["count"] == subcategories.count()
    assert response.json()["results"][0]["name"] == "category 0: subcategory 0"
    assert response.json()["results"][0]["category"] == subcat.category.pk
Example #12
0
def test_professional_photos_list(
    client_with_token: Client,
    professional_photos: QuerySet,
):
    """Should return a professional photos list."""
    obj = professional_photos.first()
    response = client_with_token.get(reverse("professional-photos-list"))
    data = response.json()
    assert response.status_code == 200
    assert data["count"] == professional_photos.count()
    assert data["results"][0]["name"] == obj.name
Example #13
0
def test_service_photos_list(
    client_with_token: Client,
    services: QuerySet,
):
    """Should return a service photos list."""
    obj = services.first().photos.first()
    response = client_with_token.get(reverse("service-photos-list"))
    data = response.json()

    assert response.status_code == 200
    assert data["count"] == services.count()
    assert data["results"][0]["name"] == obj.name
def test_account_professional_foreign_key(user_locations: QuerySet):
    """Should return the filtered list of user_locations by a user."""
    obj = AccountUserLocationForeignKey()
    request = HttpRequest()
    user = user_locations[0].user
    request.user = user
    obj._context = {"request": request}  # pylint: disable=protected-access
    result = obj.get_queryset()

    assert user_locations.count() == 4
    assert result.count() == 2
    assert result.first().user == user
Example #15
0
def test_suggested_messages_list(
    client_with_token: Client,
    suggested_messages: QuerySet,
):
    """Should return a list of suggested messages."""
    message = suggested_messages.first()
    response = client_with_token.get(reverse("messages-suggested-list"))

    assert response.status_code == 200
    assert response.accepted_media_type == "application/json"
    assert response.json()["count"] == suggested_messages.count()
    assert response.json()["results"][0]["name"] == message.name
def test_account_service_foreign_key(services: QuerySet):
    """Should return the filtered list of services by a user."""
    obj = AccountServiceForeignKey()
    request = HttpRequest()
    user = services[0].professional.user
    request.user = user
    obj._context = {"request": request}  # pylint: disable=protected-access
    result = obj.get_queryset()

    assert services.count() == 8
    assert result.count() == 4
    assert not [r for r in result.all() if r.professional.user != user]
Example #17
0
def test_contacts_list_filtered(
    admin_client: Client,
    contacts: QuerySet,
    countries: List[Country],
):
    """Should return a filtered list of languages."""
    response = admin_client.get(
        reverse("contacts-list") + f"?by_country={countries[0].pk}")

    assert response.status_code == 200
    assert response.accepted_media_type == "application/json"
    assert response.json()["count"] != contacts.count()
    assert response.json()["results"][0]["name"] == "icq"
Example #18
0
def tag_cloud_context(tags: QuerySet) -> Dict[Any, Any]:
    if not tags.exists():
        return {}
    min_size = 9
    max_size = 20
    tags = tags.annotate(Count('posts')).order_by('posts__count')
    min_count = tags[0].posts__count
    max_count = tags[tags.count()-1].posts__count
    def font_size(count):
        if max_count == min_count:
            return (max_size + min_size) / 2
        else:
            slope = (max_size - min_size) / (max_count - min_count)
            return min_size + slope * count
    return {tag: font_size(tag.posts__count) for tag in tags}
Example #19
0
def test_contact_manager_get_by_country(
    countries: List[Country],
    contacts: QuerySet,
):
    """Should return a list of contacts filtered by the country."""
    result0 = Contact.objects.get_by_country(countries[0])

    assert contacts.count() != result0.count()
    assert result0[0].name == "icq"
    assert result0[1].name == "telegram"

    result1 = Contact.objects.get_by_country(countries[1])

    assert result0.count() != result1.count()
    assert result1[0].name == "whatsapp"
    def __init__(self, urls: QuerySet) -> None:
        """Initialize the ModelIterator.

        :param urls: A QuerySet of ReferencedPaths, ordered by path.
        """
        self.count = urls.count()

        self.urls: List[ReferencedPath] = [u for u in urls]
        # these should already be *mostly* sorted
        # problem is, SQL sorts "_" before ".",
        # but python does it the other way around
        # so this has to be re-sorted to match the sorting used within the CSV
        self.urls.sort(key=lambda a: a.path)

        self.i = 0
Example #21
0
 def sync_issue(self, request: HttpRequest, queryset: QuerySet) -> None:
     count = queryset.count()
     for issue in queryset[:10]:
         update = pull_issue(str(issue.id))
         self.message_user(
             request,
             f"Issue {update.identifier} was successfully updated.",
             messages.SUCCESS,
         )
     if count > 10:
         self.message_user(
             request,
             "Update ignored for remaining issues - use import command instead.",
             messages.WARNING,
         )
         return
Example #22
0
    def restore_deleted_messages(self, time_delete, user):
        # Bypass deleted messages filtering
        role = self.get_accessor_name() == 'inbox' and 'recipient' or 'sender'
        lookup = {'%s_delete_at' % role: time_delete}
        lookup.update(self.core_filters)
        qs = QuerySet(self.model).filter(**lookup)
        
        count_restore = qs.count()
        if count_restore:
            for message in qs:
                message.set_delete_flag(user, None)
            first_restore = qs[0]
        else:
            first_restore = None

        return first_restore, count_restore
Example #23
0
def test_services_list(
    client_with_token: Client,
    services: QuerySet,
):
    """Should return a services list."""
    obj = services.first()
    response = client_with_token.get(reverse("services-list"))
    data = response.json()

    assert response.status_code == 200
    assert data["count"] == services.count()
    assert data["results"][0]["name"] == obj.name
    assert data["results"][0]["price"]["start_price"] == str(
        obj.price.start_price.amount)
    assert len(data["results"][0]["tags"]) == obj.tags.count()
    assert len(data["results"][0]["locations"]) == obj.locations.count()
Example #24
0
    def handle(self, **options):

        limit = options.get('limit', None)
        loop_sleep = options.get('loop_sleep', 0.001)
        info = options.get('info', False)

        if info:
            qs = QuerySet(model=Page)
            nonmigrated = qs.filter(layout_migrated=False).count()
            total = qs.count()
            l = len(str(total))
            print str(total - nonmigrated).rjust(l), 'pages allready migrated'
            print str(nonmigrated).rjust(l), 'pages NOT YET migrated'
            print str(total).rjust(l), "pages TOTAL"
            return

        migrate(limit, loop_sleep)
Example #25
0
    def handle(self, **options):

        limit = options.get('limit',None)
        loop_sleep = options.get('loop_sleep', 0.001)
        info = options.get('info', False)

        if info:
            qs = QuerySet(model=Page)
            nonmigrated = qs.filter(layout_migrated=False).count()
            total = qs.count()
            l = len(str(total))
            print str(total-nonmigrated).rjust(l), 'pages allready migrated'
            print str(nonmigrated).rjust(l), 'pages NOT YET migrated'
            print str(total).rjust(l), "pages TOTAL"
            return

        migrate(limit, loop_sleep)
Example #26
0
def test_get_sent_messages(admin: User, messages: QuerySet):
    """Should return sent messages."""
    manager = Message.objects
    query = manager.get_sent_messages(admin)
    num = OBJECTS_TO_CREATE
    message = query.first()
    message.is_deleted_from_sender = True
    message.save()

    query = manager.get_sent_messages(admin)
    message = query.first()
    assert num - 1 == query.count()
    assert num != messages.count()
    assert message.sender == admin

    message.is_read = True
    message.save()
    assert num - 2 == manager.get_sent_messages(admin, is_read=False).count()
Example #27
0
def pagination(request: WSGIRequest, qset: QuerySet):
    """Divides the entries in a query set in pages.

    Returns a dictionary with data for the context."""
    pages = range(1, qset.count() // ENTRIES_PER_PAGE + 2)
    if len(qset) % 10 == 0 and len(pages) > 1:
        pages = pages[:-1]
    try:
        current_page = int(request.GET.get('page', 1))
    except ValueError:
        current_page = 1
    item_i = ENTRIES_PER_PAGE * (current_page - 1)
    item_f = item_i + ENTRIES_PER_PAGE

    return {
        'set': qset[item_i:item_f],
        'pages': pages,
        'current_page': current_page,
    }
Example #28
0
def calculate_progress_counters(unfiltered_user_games: QuerySet) -> Tuple[int, int, int, int, int, int, int]:
    # counters use unfiltered list
    unfiltered_games_count = unfiltered_user_games.count()
    currently_playing_games_count = unfiltered_user_games.filter(currently_playing=True).count()
    finished_games_count = unfiltered_user_games.exclude(year_finished__isnull=True).count()
    abandoned_games_count = unfiltered_user_games.filter(abandoned=True).count()
    completed_games_count = finished_games_count + abandoned_games_count
    pending_games_count = unfiltered_games_count - completed_games_count
    if unfiltered_games_count > 0:
        completed_games_progress = int(completed_games_count * 100 / unfiltered_games_count)
    else:
        completed_games_progress = 0

    return (
        unfiltered_games_count,
        currently_playing_games_count,
        finished_games_count,
        abandoned_games_count,
        completed_games_count,
        pending_games_count,
        completed_games_progress,
    )
Example #29
0
def _get_matching_orders(
    queryset: QuerySet,
    base_token_address,
    quote_token_address,
    network,
    contract_address,
    min_eth_volume,
    min_token_volume,
    max_eth_value,
    max_token_value,
):
    """
    Returns orders filtered by the min and max amounts.
    """

    _set_base_amount_contributed(queryset)

    logging.info('Total public and active orders: {}'.format(queryset.count()))

    return queryset.filter(
        Q(
            network=network,
            contract_address=contract_address.lower(),
            base_address=base_token_address.lower(),
            # base_limit__lte=max_eth_value,
            base_limit__range=(min_eth_volume, max_eth_value),
            base_amount_contributed=F('base_limit') * ETH_DECIMALS,
            quote_address=quote_token_address.lower(),
            is_closed_by_limiter=False,
        ) | Q(
            network=network,
            contract_address=contract_address.lower(),
            base_address=quote_token_address.lower(),
            # base_limit__lte=max_token_value,
            base_limit__range=(min_token_volume, max_token_value),
            base_amount_contributed=F('base_limit') * ETH_DECIMALS,
            quote_address=base_token_address.lower(),
            is_closed_by_limiter=False,
        ))
Example #30
0
def test_command_generate_slots(
    professionals: QuerySet,
    services: QuerySet,
    mocker: MockFixture,
):
    """Should filter a queryset by user."""
    professionals_generator = mocker.patch(
        "schedule.availability.generate_for_professional")
    services_generator = mocker.patch(
        "schedule.availability.generate_for_service")
    call_command("generate_slots")
    total_professionals = professionals.count()
    total_services = services.filter(is_base_schedule=False).count()
    assert professionals_generator.call_count == total_professionals
    assert services_generator.call_count == total_services

    call_command(
        "generate_slots",
        professionals=[professionals.first().pk],
        services=[services.filter(is_base_schedule=False).first().pk],
    )
    assert professionals_generator.call_count == total_professionals + 1
    assert services_generator.call_count == total_services + 1
Example #31
0
 def set_teacher(self, request, queryset: QuerySet):
     # 自动建立教师和学生两个用户组
     if not Group.objects.filter(name='teacher').exists():
         teacher = Group.objects.create(name='teacher')
         teacher.permissions.add(
             Permission.objects.get(codename='polls.view_MyUser'),
             Permission.object.get(codename='polls.view_Resume'),
             Permission.object.get(codename='polls.change_Resume'),
             Permission.object.get(codename='polls.view_Announcement'),
             Permission.object.get(codename='polls.add_Announcement'),
             Permission.object.get(codename='polls.delete_Announcement'),
             Permission.object.get(codename='polls.view_ResumeResult'),
             Permission.object.get(codename='polls.change_ResumeResult'),
         )
         teacher.save()
     try:
         for obj in queryset:
             obj.groups.set([Group.objects.get(name='teacher')])
             obj.is_staff = True
             obj.save()
         self.message_user(request, '将{}个账号变更为教师'.format(queryset.count()), messages.SUCCESS)
     except Exception as e:
         self.message_user(request, e.__str__(), messages.ERROR)
    def get_results(self):
        #qs = QuerySet(model = self.model, using = self.using).select_related()
        qs = QuerySet(model = self.model, using = self.using)
        if self.where:
            qs = qs.prefetch_related("tel_zone", "account", "called_account").extra(where = [self.where])
        
        self.results = list(qs)
        # вот тут мы применяем сортировки
        
        def cmp_func(a, b):
            #try:
            v1 = getattr(a, self.fields[self.sort][0])
            v2 = getattr(b, self.fields[self.sort][0])

            if self.order == ASC:
                if v1 < v2:
                    return -1
                elif v1 > v2:
                    return 1
            
            if self.order == DESC:
                if v1 < v2:
                    return 1
                elif v1 > v2:
                    return -1
            
            #except Exception, e:
            #    print "Exception in cmp_func:", e
            #    pass
            
            return 0
        
        if not self.sort is None and not self.order is None:
            self.results.sort(cmp = cmp_func)
        self.r_count = qs.count()
        self.have_results = True
Example #33
0
def test_generate_future_availability_slots_task(
    professionals: QuerySet,
    services: QuerySet,
    mocker: MockFixture,
):
    """Should generate future availability slots."""
    professionals_generator = mocker.patch(
        "schedule.availability.tasks.generate_for_professional")
    services_generator = mocker.patch(
        "schedule.availability.tasks.generate_for_service")
    generate_future_availability_slots_task.apply_async()

    assert professionals_generator.call_count == professionals.count()
    assert services_generator.call_count == services.filter(
        is_base_schedule=False).count()

    professionals_generator.assert_called_with(
        professionals.last(),
        append_days=True,
    )
    services_generator.assert_called_with(
        services.filter(is_base_schedule=False).last(),
        append_days=True,
    )
Example #34
0
def publisher_advertisers(request,
                          view='my',
                          page=None,
                          template='publisher/advertisers/index.html'):
    ''' View to manage Publisher's Advertisers.  This view has three different resultsets
        based on the URL specified.  '/my/' displays this Publishers Advertisers.
        '/find/' provides a search interface to all Advertisers, and '/expired/'
        displays this Publisher's expired Advertisers.  This View has sortable result
        columns based on the GET variable 'sort' and the template displays different
        actions for each View based upon the form variable "view" which is derived
        from the URL.
    '''
    from atrinsic.base.models import Organization
    from atrinsic.util.xls import write_rows
    from forms import AdvertiserSearchForm
    import tempfile
    from django.db.models import Q

    q = None
    vertical = None
    sort_next = '#'

    download = False

    if request.GET:
        form = AdvertiserSearchForm(request.organization, request.GET)

        if form.is_valid():
            q = form.cleaned_data.get('q', None)
            vertical = form.cleaned_data.get('vertical', None)
            min_rating = form.cleaned_data.get('network_rating', None)
            date_from = form.cleaned_data.get('date_from', None)
            date_to = form.cleaned_data.get('date_to', None)

            if (vertical == '-1') or len(vertical) < 1:
                vertical = None

            if view == 'my':
                settab(request, "Publisher", "Advertisers", "My Advertisers")
                # My Advertisers
                qs = Organization.objects.filter(
                    publisher_relationships__status=RELATIONSHIP_ACCEPTED,
                    status=ORGSTATUS_LIVE,
                    publisher_relationships__publisher=request.organization
                ).extra(
                    select={
                        "publisher_id":
                        "select publisher_id from base_organization where id="
                        + str(request.organization.id)
                    })

                if request.GET.get('download', None) is not None:
                    template = 'publisher/advertisers/download.csv'
                    download = True

            elif view == 'expired':
                settab(request, "Publisher", "Advertisers",
                       "Expired Advertisers")
                qs = Organization.objects.filter(
                    publisher_relationships__status__in=[
                        RELATIONSHIP_EXPIRED, RELATIONSHIP_DECLINED
                    ],
                    status=ORGSTATUS_LIVE,
                    publisher_relationships__publisher=request.organization
                ).extra(
                    select={
                        "publisher_id":
                        "select publisher_id from base_organization where id="
                        + str(request.organization.id)
                    })

            else:
                # Default Advertiser Finder
                qs = Organization.objects.filter(org_type=ORGTYPE_ADVERTISER,
                                                 status=ORGSTATUS_LIVE).filter(
                                                     has_program_term=True,
                                                     is_private=False)
            if q is not None:
                qs = qs.filter(
                    (Q(show_alias=True) & Q(company_alias__icontains=q))
                    | (Q(show_alias=False) & Q(company_name__icontains=q)))

            if vertical is not None:
                qs = qs.filter(vertical__order=vertical)
            else:
                qs = qs.filter(is_adult=request.organization.is_adult)

            if min_rating is not None:
                qs = qs.filter(network_rating__gte=str(min_rating))

            if form.cleaned_data.get('email_marketing', False):
                qs = qs.filter(allow_third_party_email_campaigns=True)

            if form.cleaned_data.get('direct_linking', False):
                qs = qs.filter(allow_direct_linking_through_ppc=True)

            if form.cleaned_data.get('trademark_bidding', False):
                qs = qs.filter(allow_trademark_bidding_through_ppc=True)

            if date_from is not None:
                qs = qs.filter(date_joined__gte=date_from)

            if date_to is not None:
                qs = qs.filter(date_joined__lte=date_to)
        else:
            qs = QuerySet()

    else:
        form = AdvertiserSearchForm(organization=request.organization)

        if view == 'my':
            settab(request, "Publisher", "Advertisers", "My Advertisers")
            # My Advertisers
            qs = Organization.objects.filter(
                publisher_relationships__status=RELATIONSHIP_ACCEPTED,
                status=ORGSTATUS_LIVE,
                publisher_relationships__publisher=request.organization
            ).extra(
                select={
                    "publisher_id":
                    "select publisher_id from base_organization where id=" +
                    str(request.organization.id)
                })
        elif view == 'expired':
            settab(request, "Publisher", "Advertisers", "Expired Advertisers")
            qs = Organization.objects.filter(
                publisher_relationships__status__in=[
                    RELATIONSHIP_EXPIRED, RELATIONSHIP_DECLINED
                ],
                status=ORGSTATUS_LIVE,
                publisher_relationships__publisher=request.organization
            ).extra(
                select={
                    "publisher_id":
                    "select publisher_id from base_organization where id=" +
                    str(request.organization.id)
                })
        else:
            # XXX
            qs = Organization.objects.none()

    sort = request.GET.get('sort', 'date_joined').lower()
    if qs.model and qs.count():
        display_results = True
        sort_fields = [
            'ticker',
            'company_name',
            'state',
            'country',
            'vertical',
            'network_rating',
            'date_joined',
            'contact_firstname',
            'force',
        ]

        for f in sort_fields:
            if sort.endswith(f):
                if sort.startswith('-'):
                    sort_next = sort[1:]
                else:
                    sort_next = '-%s' % sort

                qs = qs.order_by(sort)
                break
        # if finding, remove all the advertisers that have outstanding relationships
        if view == 'find':
            result = []
            for i in qs:
                rs = i.get_advertiser_relationship(request.organization)
                if rs == None:
                    result.append(i)
                elif rs.status == RELATIONSHIP_NONE:
                    result.append(i)
            total_results = len(result)
            qs = result
        else:
            total_results = qs.count()

    else:
        if view == 'expired':
            display_results = True
            total_results = 0
        elif form.is_valid():
            display_results = True
            total_results = 0
        else:
            display_results = False
            total_results = 0

    if download == True:
        file_id, file_path = tempfile.mkstemp()

        res = [[
            'Ticker', 'Company Name', 'State', 'Country', 'Vertical',
            'Network Rating', 'Date Joined', 'Force'
        ]]
        for row in qs:
            res.append([
                str(row.ticker),
                str(row.company_name),
                str(row.state),
                str(row.country),
                str(row.vertical),
                str(row.network_rating),
                str(row.date_joined),
                str(row.force)
            ])

        write_rows(file_path, res)
        res = open(file_path).read()

        response = HttpResponse(res, mimetype="application/vnd.ms-excel")
        response[
            'Content-Disposition'] = 'attachment; filename=myadvertisers.xls'
        return response
    else:
        return object_list(request,
                           queryset=qs,
                           allow_empty=True,
                           page=page,
                           template_name='publisher/advertisers/index.html',
                           paginate_by=50,
                           extra_context={
                               'q': q,
                               'display_results': display_results,
                               'form': form,
                               'sort': sort,
                               'sort_next': sort_next,
                               'total_results': total_results,
                               'view': view,
                           })
    def render(self, name, value, attrs=None):
        if value is None:
            value = []

        display = ''
        if self.url:
            url = self.url
            # todo: Display is not so simple in this case. Needs a lot of work.
            # Will probably have to be a dictionary.
            display = self.initial_display
        else:
            dc, dc, query = pickle.loads(
                _simple_autocomplete_queryset_cache[self.token]
            )
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteMultipleWidget, self).render(
                    name, value, attrs
                )
            else:
                url = reverse('simple-autocomplete', args=[self.token])
                fieldname = get_search_fieldname(self.model)

            html = u"""
    <script type="text/javascript">
    $(document).ready(function(){

    $("#id_%s_helper").autocomplete({
        source: function(request, response){
            $.ajax({
                url: "%s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                    {
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                    }
                },
                dataType: "json"
            });
        },
        select: function(event, ui) {
            var name = '%s';
            var parent = $('#id_' + name).parent();
            var target = $('div.autocomplete-placeholder', parent);
            target.append('<p><input name="' + name + '" value="' + ui.item.real_value + '" ' 
                + 'type="hidden" />' + ui.item.value 
                + ' <a href="#" title="Remove" onclick="$(this).parent().remove(); $('+"'"+'#id_%s_helper'+"'"+').val(' + "''" + '); $('+"'"+'#id_%s_helper'+"'"+').focus(); return false;">x<small></small></a></p>');
        },
        close: function(event, ui) {
            $('#id_%s_helper').val('');
        },
        minLength: 3
    });

    });
    </script>

<input id="id_%s_helper" type="text" value="" />
<input id="id_%s" type="hidden" value="" />
<div class="autocomplete-placeholder">""" % (name, url, name, name, name, name, name, name)

            # Create html for existing values
            for v in value:
                display = unicode(queryset.get(pk=v))
                html += """<p><input name="%s" type="hidden" value="%s" />
%s <a href="#" title="Remove" onclick="$(this).parent().remove(); $('#id_%s_helper').val(''); $('#id_%s_helper').focus(); return false;">x<small></small></a></p>""" % (name, v, display, name, name)

            html += "</div>"

            # Help with green plus icon alignment
            # todo: use css class
            html += """<div style="display: inline-block; width: 104px;">&nbsp;</div>"""

            return mark_safe(html)
Example #36
0
def publisher_advertisers(request, view='my', page=None, template='publisher/advertisers/index.html'):
    ''' View to manage Publisher's Advertisers.  This view has three different resultsets
        based on the URL specified.  '/my/' displays this Publishers Advertisers.
        '/find/' provides a search interface to all Advertisers, and '/expired/'
        displays this Publisher's expired Advertisers.  This View has sortable result
        columns based on the GET variable 'sort' and the template displays different
        actions for each View based upon the form variable "view" which is derived
        from the URL.
    '''
    from atrinsic.base.models import Organization
    from atrinsic.util.xls import write_rows
    from forms import AdvertiserSearchForm
    import tempfile
    from django.db.models import Q
    
    q = None
    vertical = None
    sort_next = '#'

    download = False
    
    if request.GET:
        form = AdvertiserSearchForm(request.organization, request.GET)

        if form.is_valid():
            q = form.cleaned_data.get('q', None)
            vertical = form.cleaned_data.get('vertical', None)
            min_rating = form.cleaned_data.get('network_rating', None)
            date_from = form.cleaned_data.get('date_from', None)
            date_to = form.cleaned_data.get('date_to', None)
            
            
            if (vertical == '-1') or len(vertical) < 1:
                vertical = None

            if view == 'my':
                settab(request,"Publisher","Advertisers","My Advertisers")
                # My Advertisers
                qs = Organization.objects.filter(publisher_relationships__status=RELATIONSHIP_ACCEPTED,status=ORGSTATUS_LIVE,
                    publisher_relationships__publisher=request.organization).extra(select={"publisher_id":"select publisher_id from base_organization where id="+str(request.organization.id)})

                if request.GET.get('download', None) is not None:
                    template = 'publisher/advertisers/download.csv'
                    download = True

            elif view == 'expired':
                settab(request,"Publisher","Advertisers","Expired Advertisers")
                qs = Organization.objects.filter(publisher_relationships__status__in=[RELATIONSHIP_EXPIRED,RELATIONSHIP_DECLINED],status=ORGSTATUS_LIVE,
                    publisher_relationships__publisher=request.organization).extra(select={"publisher_id":"select publisher_id from base_organization where id="+str(request.organization.id)})

            else:
                # Default Advertiser Finder
                qs = Organization.objects.filter(org_type=ORGTYPE_ADVERTISER,status=ORGSTATUS_LIVE).filter(has_program_term=True, is_private=False)
            if q is not None:
                qs = qs.filter((Q(show_alias=True) & Q(company_alias__icontains=q)) | (Q(show_alias=False) & Q(company_name__icontains=q)))

            if vertical is not None:
                qs = qs.filter(vertical__order=vertical)
            else:
                qs = qs.filter(is_adult=request.organization.is_adult)
                
            if min_rating is not None:
                qs = qs.filter(network_rating__gte=str(min_rating))

            if form.cleaned_data.get('email_marketing', False):
                qs = qs.filter(allow_third_party_email_campaigns=True)
           
            if form.cleaned_data.get('direct_linking', False):
                qs = qs.filter(allow_direct_linking_through_ppc=True)
             
            if form.cleaned_data.get('trademark_bidding', False):
                qs = qs.filter(allow_trademark_bidding_through_ppc=True)                
            
            if date_from is not None:
                qs = qs.filter(date_joined__gte=date_from)

            if date_to is not None:
                qs = qs.filter(date_joined__lte=date_to)
        else:
            qs = QuerySet()

    else:
        form = AdvertiserSearchForm(organization=request.organization)

        if view == 'my':
            settab(request,"Publisher","Advertisers","My Advertisers")
            # My Advertisers
            qs = Organization.objects.filter(publisher_relationships__status=RELATIONSHIP_ACCEPTED,status=ORGSTATUS_LIVE,
                                             publisher_relationships__publisher=request.organization).extra(select={"publisher_id":"select publisher_id from base_organization where id="+str(request.organization.id)})
        elif view == 'expired':
            settab(request,"Publisher","Advertisers","Expired Advertisers")
            qs = Organization.objects.filter(publisher_relationships__status__in=[RELATIONSHIP_EXPIRED,RELATIONSHIP_DECLINED],status=ORGSTATUS_LIVE,
                publisher_relationships__publisher=request.organization).extra(select={"publisher_id":"select publisher_id from base_organization where id="+str(request.organization.id)})
        else:
            # XXX
            qs = Organization.objects.none()

    sort = request.GET.get('sort', 'date_joined').lower()
    if qs.model and qs.count():
        display_results = True
        sort_fields = [ 'ticker', 'company_name', 'state', 'country', 'vertical', 'network_rating',
                    'date_joined', 'contact_firstname', 'force', ]

        for f in sort_fields:
            if sort.endswith(f):
                if sort.startswith('-'):
                    sort_next = sort[1:]
                else:
                    sort_next = '-%s' % sort

                qs = qs.order_by(sort)
                break
        # if finding, remove all the advertisers that have outstanding relationships
        if view == 'find':
            result = []
            for i in qs:
                rs = i.get_advertiser_relationship(request.organization)
                if rs == None:
                    result.append(i)
                elif rs.status == RELATIONSHIP_NONE:
                    result.append(i)
            total_results = len(result)
            qs = result
        else:
            total_results = qs.count()
        
    else:
        if view == 'expired':
            display_results = True
            total_results = 0
        elif form.is_valid():
            display_results = True
            total_results = 0
        else:
            display_results = False
            total_results = 0

    if download == True:
        file_id,file_path = tempfile.mkstemp()

        res = [[ 'Ticker', 'Company Name', 'State', 'Country', 'Vertical', 'Network Rating','Date Joined', 'Force']]
        for row in qs:
            res.append([str(row.ticker),
                        str(row.company_name),
                        str(row.state),
                        str(row.country),
                        str(row.vertical),
                        str(row.network_rating),
                        str(row.date_joined),
                        str(row.force)])
            
        write_rows(file_path,res)
        res = open(file_path).read()
        
        response = HttpResponse(res,mimetype="application/vnd.ms-excel")
        response['Content-Disposition'] = 'attachment; filename=myadvertisers.xls'
        return response
    else:
        return object_list(request, queryset=qs, allow_empty=True, page=page,
                           template_name='publisher/advertisers/index.html', paginate_by=50, extra_context={ 
            'q' : q,
            'display_results' : display_results,
            'form' : form,
            'sort' : sort,
            'sort_next' : sort_next,
            'total_results' : total_results,
                'view' : view,

            })
Example #37
0
def qs_to_result(result: QuerySet,
                 stride: int = 1,
                 group: bool = False,
                 shuffle: bool = False,
                 deterministic_order: bool = False,
                 custom_order_by_id: List[int] = None,
                 frame_major: bool = True,
                 show_count: bool = False,
                 limit: int = 100,
                 color: str = "red") -> Dict:

    count = result.count() if show_count else 0

    if shuffle:
        result = result.order_by('?')

    materialized_result = []
    cls = result.model
    bases = cls.__bases__
    if bases[0] is base_models.Frame:
        if custom_order_by_id is not None:
            result = sorted(result, key=lambda x: custom_order_by_id.index(x.id))
        elif not shuffle and deterministic_order:
            result = result.order_by('video', 'number')
        for frame in result[:limit * stride:stride]:
            materialized_result.append({
                'video': frame.video.id,
                'min_frame': frame.number,
                'objects': []
            })

    elif (cls is Face or cls is FaceGender or cls is FaceIdentity
            or cls is Object or cls is Pose or cls is FaceLandmarks):
        if cls is FaceGender or cls is FaceIdentity or cls is FaceLandmarks:
            frame_path = 'face__frame'
            if cls is FaceGender:
                result = result.select_related('face', 'gender')
            elif cls is FaceIdentity:
                result = result.select_related('face', 'identity')
            else:
                result = result.select_related('face')
        else:
            frame_path = 'frame'
        result = result.select_related(frame_path)

        if not shuffle and deterministic_order:
            result = result.order_by(frame_path + '__video', frame_path + '__number')

        if cls is Face:
            fn = bbox_to_dict
        elif cls is Object:
            fn = object_to_dict
        elif cls is FaceGender:
            fn = gender_to_dict
        elif cls is FaceIdentity:
            fn = identity_to_dict
        elif cls is Pose:
            fn = pose_to_dict
        elif cls is FaceLandmarks:
            fn = face_landmarks_to_dict

        if frame_major:
            frame_ids = set()

            def get_all_results():
                all_results = collect(
                    list(result.filter(**{frame_path + '__in': list(frame_ids)})),
                    lambda t: access(t, frame_path + '__id'))
                return all_results

            if custom_order_by_id is None:
                frames = set()
                for inst in list(
                        result.values(
                            frame_path + '__video', frame_path + '__number',
                            frame_path + '__id').annotate(m=F('id') % stride).filter(m=0)[:limit]):
                    frames.add((inst[frame_path + '__video'], inst[frame_path + '__number'],
                                inst[frame_path + '__id']))
                    frame_ids.add(inst[frame_path + '__id'])

                all_results = get_all_results()
                frames = list(frames)
                frames.sort(key=itemgetter(0, 1))

            else:
                frames = {}
                id_to_position = defaultdict(lambda: float('inf'))
                for i, id_ in enumerate(custom_order_by_id):
                    id_to_position[id_] = i
                for inst in list(
                        result.values(
                            'id', frame_path + '__video', frame_path + '__number',
                            frame_path + '__id').annotate(m=F('id') % stride).filter(m=0)):
                    frame_key = (inst[frame_path + '__video'], inst[frame_path + '__number'],
                                 inst[frame_path + '__id'])
                    frames[frame_key] = min(id_to_position[inst['id']], frames[frame_key]
                                            if frame_key in frames else float('inf'))
                    frame_ids.add(inst[frame_path + '__id'])
                all_results = get_all_results()
                frames = sorted([x for x in frames.items()], key=lambda x: x[1])
                frames = [x[0] for x in frames[:limit]]

            for (video, frame_num, frame_id) in frames:
                materialized_result.append({
                    'video': video,
                    'min_frame': frame_num,
                    'objects': [fn(inst) for inst in all_results[frame_id]]
                })


        else:
            for inst in result[:limit * stride:stride]:
                r = {
                    'video': inst.frame.video.id,
                    'min_frame': inst.frame.number,
                    'objects': [fn(inst)]
                }
                materialized_result.append(r)

    elif bases[0] is base_models.Track:
        if not shuffle and deterministic_order:
            result = result.order_by('video', 'min_frame')

        for t in result.annotate(duration=Track.duration_expr()).filter(duration__gt=0)[:limit]:
            result = {
                'video': t.video.id,
                'track': t.id,
                'min_frame': t.min_frame,
                'max_frame': t.max_frame,
            }

            materialized_result.append(result)
        if custom_order_by_id is not None:
            materialized_result.sort(key=lambda x: custom_order_by_id.index(x['track']))
        else:
            materialized_result.sort(key=itemgetter('video', 'min_frame'))

    elif bases[0] is base_models.Video:
        if custom_order_by_id is not None:
            raise NotImplementedError()

        if not shuffle and deterministic_order:
            result = result.order_by('id')

        for v in result[:limit]:
            materialized_result.append({
                'video': v.id,
                'min_frame': 0,
                'max_frame': v.num_frames})

    else:
        raise Exception("Unsupported class")

    ty_name = cls.__name__
    if group:
        by_video = collect(materialized_result, itemgetter('video'))
        videos = collect(Video.objects.filter(id__in=by_video.keys()).all(),
                attrgetter('id'))
        groups = [{
            'type': 'contiguous',
            'label': video,
            'num_frames': videos[video][0].num_frames,
            'elements': [{
                'video': video,
                'segments': sorted(by_video[video], key=itemgetter('min_frame')),
                'color': color
            }]
        } for video in sorted(by_video.keys())]
    else:
        groups = [{'type': 'flat', 'label': '', 'elements': [r]} for r in materialized_result]

    return {'result': groups, 'count': count, 'type': ty_name}
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''

        display = ''
        if self.url:
            url = self.url
            display = self.initial_display

        else:
            dc, dc, query = pickle.loads(
                _simple_autocomplete_queryset_cache[self.token]
            )
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteWidget, self).render(
                    name, value, attrs
                )
            else:
                url = reverse('simple_autocomplete:simple-autocomplete', args=[self.token])
                if value:
                    display = unicode(queryset.get(pk=value))

        html = u"""
    <script type="text/javascript">
    (function($) {

    $(document).ready(function() {

    $("#id_%(name)s_helper").autocomplete({
        source: function(request, response){
            $.ajax({
                url: "%(url)s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                    {
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                    }
                },
                dataType: "json"
            });
        },
        select: function(event, ui) { $('#id_%(name)s').val(ui.item.real_value); },
        minLength: 3
    });

    });

    })(django.jQuery);
    </script>

<input id="id_%(name)s_helper" type="text" value="%(display)s" />
<a href="#" title="Clear" onclick="django.jQuery('#id_%(name)s_helper').val(''); django.jQuery('#id_%(name)s_helper').focus(); django.jQuery('#id_%(name)s').val(''); return false;">x<small></small></a>
<input name="%(name)s" id="id_%(name)s" type="hidden" value="%(value)s" />""" % dict(name=name, url=url, display=display, value=value)
        return mark_safe(html)
    def render(self, name, value, attrs=None):
        if value is None:
            value = []

        display = ''
        if self.url:
            url = self.url
            # todo: Display is not so simple in this case. Needs a lot of work.
            # Will probably have to be a dictionary.
            display = self.initial_display
        else:
            dc, dc, query = pickle.loads(
                _simple_autocomplete_queryset_cache[self.token]
            )
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteMultipleWidget, self).render(
                    name, value, attrs
                )
            else:
                url = reverse('simple_autocomplete:simple-autocomplete', args=[self.token])

            html = u"""
    <script type="text/javascript">
    (function($) {

    $(document).ready(function() {

    $("#id_%s_helper").autocomplete({
        source: function(request, response) {
            $.ajax({
                url: "%s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                    {
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                    }
                },
                dataType: "json"
            });
        },
        select: function(event, ui) {
            var name = '%s';
            var parent = $('#id_' + name).parent();
            var target = $('div.autocomplete-placeholder', parent);
            target.append('<p><input name="' + name + '" value="' + ui.item.real_value + '" '
                + 'type="hidden" />' + ui.item.value
                + ' <a href="#" title="Remove" onclick="django.jQuery(this).parent().remove(); django.jQuery('+"'"+'#id_%s_helper'+"'"+').val(' + "''" + '); django.jQuery('+"'"+'#id_%s_helper'+"'"+').focus(); return false;">x<small></small></a></p>');
        },
        close: function(event, ui) {
            django.jQuery('#id_%s_helper').val('');
        },
        minLength: 3
    });

    });

    })(django.jQuery);
    </script>

<input id="id_%s_helper" type="text" value="" />
<input id="id_%s" type="hidden" value="" />
<div class="autocomplete-placeholder">""" % (name, url, name, name, name, name, name, name)

            # Create html for existing values
            for v in value:
                if v is None: continue
                display = unicode(queryset.get(pk=v))
                html += """<p><input name="%s" type="hidden" value="%s" />
%s <a href="#" title="Remove" onclick="django.jQuery(this).parent().remove(); django.jQuery('#id_%s_helper').val(''); django.jQuery('#id_%s_helper').focus(); return false;">x<small></small></a></p>""" % (name, v, display, name, name)

            html += "</div>"

            # Help with green plus icon alignment
            # todo: use css class
            html += """<div style="display: inline-block; width: 104px;">&nbsp;</div>"""

            return mark_safe(html)