Ejemplo n.º 1
0
def bookmark_search_page(request):
	bookmarks = EmptyQuerySet()
	search_type = ''
	query = ''
	show_results = False
	
	if request.GET.has_key('search_type') and request.GET.has_key('query'):
		search_type = request.GET['search_type']
		query = request.GET['query'].strip()
		show_results = True
		form = BookmarkSearchForm({'search_type':search_type,'query':query})

		if search_type and query:
			if search_type =='tag':
				bookmarks = Bookmark.objects.filter(tag__name__icontains = query)
			elif search_type == 'user':
				bookmarks = Bookmark.objects.filter(user__username__icontains = query)
			elif search_type == 'bookmark':
				bookmarks = Bookmark.objects.filter(title__icontains = query)
			else:
				pass

			if request.user.username:
				bookmarks = bookmarks.filter(Q(user = request.user)|Q(shared = True))
			else:
				bookmarks = bookmarks.filter(shared = True)
	else:
		form = BookmarkSearchForm()
	return render_to_response(
	'bookmark_search_page.html',
	context_instance = RequestContext(request,{
		'search_type':search_type,
		'query':query,
		'form':form,
		'show_user':True,
		'bookmark_list':bookmarks,
		'paginate_by' : ITEMS_PER_PAGE,
		'show_results' : show_results,
	})
	)
Ejemplo n.º 2
0
def needed_ballot_positions(doc, active_positions):
    '''Returns text answering the question "what does this document
    need to pass?".  The return value is only useful if the document
    is currently in IESG evaluation.'''
    yes = [p for p in active_positions if p and p.pos_id == "yes"]
    noobj = [p for p in active_positions if p and p.pos_id == "noobj"]
    blocking = [p for p in active_positions if p and p.pos.blocking]
    recuse = [p for p in active_positions if p and p.pos_id == "recuse"]

    answer = []
    if len(yes) < 1:
        answer.append("Needs a YES.")
    if blocking:
        if len(blocking) == 1:
            answer.append("Has a %s." % blocking[0].pos.name.upper())
        else:
            if blocking[0].pos.name.upper().endswith('S'):
                answer.append("Has %d %ses." % (len(blocking), blocking[0].pos.name.upper()))
            else:
                answer.append("Has %d %ss." % (len(blocking), blocking[0].pos.name.upper()))
    needed = 1
    if doc.type_id == "draft" and doc.intended_std_level_id in ("bcp", "ps", "ds", "std"):
        needed = two_thirds_rule(recused=len(recuse))
    elif doc.type_id == "statchg":
        if isinstance(doc,Document):
            related_set = doc.relateddocument_set
        elif isinstance(doc,DocHistory):
            related_set = doc.relateddochistory_set
        else:
            related_set = EmptyQuerySet()
        for rel in related_set.filter(relationship__slug__in=['tops', 'tois', 'tohist', 'toinf', 'tobcp', 'toexp']):
            if (rel.target.document.std_level.slug in ['bcp','ps','ds','std']) or (rel.relationship.slug in ['tops','tois','tobcp']):
                needed = two_thirds_rule(recused=len(recuse))
                break
    else:
        if len(yes) < 1:
            return " ".join(answer)

    have = len(yes) + len(noobj)
    if have < needed:
        more = needed - have
        if more == 1:
            answer.append("Needs one more YES or NO OBJECTION position to pass.")
        else:
            answer.append("Needs %d more YES or NO OBJECTION positions to pass." % more)
    else:
        if blocking:
            answer.append("Has enough positions to pass once %s positions are resolved." % blocking[0].pos.name.upper())
        else:
            answer.append("Has enough positions to pass.")

    return " ".join(answer)
Ejemplo n.º 3
0
    def render(self, context):
        try:
            object = template.resolve_variable(self.object, context)
        except template.VariableDoesNotExist:
            return ''

        # extract all news
        # if obect is a Person, extract news related to all current and past charges
        if isinstance(object, Person):
            news = EmptyQuerySet()
            for c in object.all_institution_charges:
                news |= c.related_news
        elif isinstance(object, basestring):
            if object == 'politicians_all':
                news = EmptyQuerySet()
                for c in InstitutionCharge.objects.all():
                    news |= c.related_news
            if object == 'politicians_council':
                news = EmptyQuerySet()
                for c in municipality.council.charges:
                    news |= c.related_news
            if object == 'politicians_gov':
                news = EmptyQuerySet()
                for c in municipality.gov.charges:
                    news |= c.related_news
        else:
            news = object.related_news

        # filter only news of a given type (INST or COMM) (if given)
        if self.news_type:
            news = news.filter(news_type=self.news_type)

        # sort news by news_date, descending order


#        context[self.context_var] = sorted(news, key=lambda n: n.news_date or datetime.date(datetime.MINYEAR,1,1), reverse=True)[0:15]
        context[self.context_var] = news.order_by("-created")[0:15]

        return ''
Ejemplo n.º 4
0
    def render(self, context):
        try:
            object = template.resolve_variable(self.object, context)
        except template.VariableDoesNotExist:
            return ''


        # extract all news
        # if obect is a Person, extract news related to all current and past charges
        if isinstance(object, Person):
            news = EmptyQuerySet()
            for c in object.all_institution_charges:
                news |= c.related_news
        elif isinstance(object, basestring):
            if object == 'politicians_all':
                news = EmptyQuerySet()
                for c in InstitutionCharge.objects.all():
                    news |= c.related_news
            if object == 'politicians_council':
                news = EmptyQuerySet()
                for c in municipality.council.charges:
                    news |= c.related_news
            if object == 'politicians_gov':
                news = EmptyQuerySet()
                for c in municipality.gov.charges:
                    news |= c.related_news
        else:
            news = object.related_news

        # filter only news of a given type (INST or COMM) (if given)
        if self.news_type:
            news = news.filter(news_type=self.news_type)

        # sort news by news_date, descending order
        context[self.context_var] = sorted(news, key=lambda n: n.news_date, reverse=True)[0:15]

        return ''
Ejemplo n.º 5
0
def voters_email(request, election, poll=None, voter_uuid=None):
    user = request.admin

    TEMPLATES = [
        ('vote', _('Time to Vote')),
        ('info', _('Additional Info')),
    ]

    default_template = 'vote'

    if not election.any_poll_feature_can_send_voter_mail:
        raise PermissionDenied('34')

    if not election.any_poll_feature_can_send_voter_booth_invitation:
        TEMPLATES.pop(0)
        default_template = 'info'

    if election.voting_extended_until and not election.voting_ended_at:
        TEMPLATES.append(('extension', _('Voting end date extended')))

    template = request.REQUEST.get('template', default_template)

    if not template in [t[0] for t in TEMPLATES]:
        raise Exception("bad template")

    polls = [poll]
    if not poll:
        polls = election.polls_by_link_id

    voter = None
    if voter_uuid:
        try:
            if poll:
                voter = get_object_or_404(Voter, uuid=voter_uuid, poll=poll)
            else:
                voter = get_object_or_404(Voter,
                                          uuid=voter_uuid,
                                          election=election)
        except Voter.DoesNotExist:
            raise PermissionDenied('35')
        if not voter:
            url = election_reverse(election, 'index')
            return HttpResponseRedirect(url)

    election_url = election.get_absolute_url()

    default_subject = render_to_string('email/%s_subject.txt' % template,
                                       {'custom_subject': "&lt;SUBJECT&gt;"})

    default_body = render_to_string(
        'email/%s_body.txt' % template, {
            'election': election,
            'election_url': election_url,
            'custom_subject': default_subject,
            'custom_message': '&lt;BODY&gt;',
            'voter': {
                'vote_hash': '<SMART_TRACKER>',
                'name': '<VOTER_NAME>',
                'voter_name': '<VOTER_NAME>',
                'voter_surname': '<VOTER_SURNAME>',
                'voter_login_id': '<VOTER_LOGIN_ID>',
                'voter_password': '******',
                'audit_passwords': '1',
                'get_audit_passwords': ['pass1', 'pass2', '...'],
                'get_quick_login_url': '<VOTER_LOGIN_URL>',
                'poll': poll,
                'election': election
            }
        })

    q_param = request.GET.get('q', None)

    filtered_voters = election.voters.filter()
    if poll:
        filtered_voters = poll.voters.filter()

    if not q_param:
        filtered_voters = EmptyQuerySet()
    else:
        voters_filters = get_filters(q_param, VOTER_TABLE_HEADERS,
                                     VOTER_SEARCH_FIELDS, VOTER_BOOL_KEYS_MAP,
                                     VOTER_EXTRA_HEADERS)
        filtered_voters = filtered_voters.filter(voters_filters)

        if not filtered_voters.count():
            message = _("No voters were found.")
            messages.error(request, message)
            url = election_reverse(election, 'polls_list')
            return HttpResponseRedirect(url)

    if request.method == "GET":
        email_form = EmailVotersForm()
        email_form.fields['subject'].initial = dict(TEMPLATES)[template]
        if voter:
            email_form.fields['send_to'].widget = \
                email_form.fields['send_to'].hidden_widget()
    else:
        email_form = EmailVotersForm(request.POST)
        if email_form.is_valid():
            # the client knows to submit only once with a specific voter_id
            voter_constraints_include = None
            voter_constraints_exclude = None
            update_booth_invitation_date = False
            if template == 'vote':
                update_booth_invitation_date = True

            if voter:
                voter_constraints_include = {'uuid': voter.uuid}

            # exclude those who have not voted
            if email_form.cleaned_data['send_to'] == 'voted':
                voter_constraints_exclude = {'vote_hash': None}

            # include only those who have not voted
            if email_form.cleaned_data['send_to'] == 'not-voted':
                voter_constraints_include = {'vote_hash': None}

            for _poll in polls:
                if not _poll.feature_can_send_voter_mail:
                    continue

                if template == 'vote' and not \
                        _poll.feature_can_send_voter_booth_invitation:
                    continue

                subject_template = 'email/%s_subject.txt' % template
                body_template = 'email/%s_body.txt' % template
                extra_vars = {
                    'custom_subject': email_form.cleaned_data['subject'],
                    'custom_message': email_form.cleaned_data['body'],
                    'election_url': election_url,
                }
                task_kwargs = {
                    'subject_template': subject_template,
                    'body_template': body_template,
                    'extra_vars': extra_vars,
                    'voter_constraints_include': voter_constraints_include,
                    'voter_constraints_exclude': voter_constraints_exclude,
                    'update_date': True,
                    'update_booth_invitation_date':
                    update_booth_invitation_date,
                    'q_param': q_param,
                }
                log_obj = election
                if poll:
                    log_obj = poll
                if voter:
                    log_obj.logger.info(
                        "Notifying single voter %s, [template: %s, filter: %s]",
                        voter.voter_login_id, template, q_param)
                else:
                    log_obj.logger.info(
                        "Notifying voters, [template: %s, filter: %r]",
                        template, q_param)
                tasks.voters_email.delay(_poll.pk, **task_kwargs)

            filters = get_voters_filters_with_constraints(
                q_param, voter_constraints_include, voter_constraints_exclude)
            send_to = filtered_voters.filter(filters)
            if q_param and not send_to.filter(filters).count():
                msg = "No voters matched your filters. No emails were sent."
                messages.error(request, _(msg))
            else:
                messages.info(request, _("Email sending started"))

            url = election_reverse(election, 'polls_list')
            if poll:
                url = poll_reverse(poll, 'voters')
            if q_param:
                url += '?q=%s' % urllib.quote_plus(q_param)
            return HttpResponseRedirect(url)

    context = {
        'email_form': email_form,
        'election': election,
        'poll': poll,
        'voter_o': voter,
        'default_subject': default_subject,
        'default_body': default_body,
        'template': template,
        'filtered_voters': filtered_voters,
        'templates': TEMPLATES
    }
    set_menu('voters', context)
    if not poll:
        set_menu('polls', context)
    return render_template(request, "voters_email", context)
Ejemplo n.º 6
0
def voters_email(request, election, poll=None, voter_uuid=None):
    user = request.admin

    TEMPLATES = [
        ('vote', _('Time to Vote')),
        ('info', _('Additional Info')),
    ]


    default_template = 'vote'

    if not election.any_poll_feature_can_send_voter_mail:
        raise PermissionDenied('34')

    if not election.any_poll_feature_can_send_voter_booth_invitation:
        TEMPLATES.pop(0)
        default_template = 'info'

    if election.voting_extended_until and not election.voting_ended_at:
        TEMPLATES.append(('extension', _('Voting end date extended')))

    template = request.REQUEST.get('template', default_template)

    if not template in [t[0] for t in TEMPLATES]:
        raise Exception("bad template")

    polls = [poll]
    if not poll:
        polls = election.polls_by_link_id

    voter = None
    if voter_uuid:
        try:
            if poll:
                voter = get_object_or_404(Voter, uuid=voter_uuid, poll=poll)
            else:
                voter = get_object_or_404(Voter, uuid=voter_uuid,
                                          election=election)
        except Voter.DoesNotExist:
            raise PermissionDenied('35')
        if not voter:
            url = election_reverse(election, 'index')
            return HttpResponseRedirect(url)

    election_url = election.get_absolute_url()

    default_subject = render_to_string(
        'email/%s_subject.txt' % template, {
            'custom_subject': "&lt;SUBJECT&gt;"
        })

    default_body = render_to_string(
        'email/%s_body.txt' % template, {
            'election' : election,
            'election_url' : election_url,
            'custom_subject' : default_subject,
            'custom_message': '&lt;BODY&gt;',
            'voter': {
                'vote_hash' : '<SMART_TRACKER>',
                'name': '<VOTER_NAME>',
                'voter_name': '<VOTER_NAME>',
                'voter_surname': '<VOTER_SURNAME>',
                'voter_login_id': '<VOTER_LOGIN_ID>',
                'voter_password': '******',
                'audit_passwords': '1',
                'get_audit_passwords': ['pass1', 'pass2', '...'],
                'get_quick_login_url': '<VOTER_LOGIN_URL>',
                'poll': poll,
                'election' : election}
            })

    q_param = request.GET.get('q', None)

    filtered_voters = election.voters.filter()
    if poll:
        filtered_voters = poll.voters.filter()

    if not q_param:
        filtered_voters = EmptyQuerySet()
    else:
        voters_filters = get_filters(q_param, VOTER_TABLE_HEADERS,
                                     VOTER_SEARCH_FIELDS,
                                     VOTER_BOOL_KEYS_MAP, 
                                     VOTER_EXTRA_HEADERS)
        filtered_voters = filtered_voters.filter(voters_filters)

        if not filtered_voters.count():
            message = _("No voters were found.")
            messages.error(request, message)
            url = election_reverse(election, 'polls_list')
            return HttpResponseRedirect(url)

    if request.method == "GET":
        email_form = EmailVotersForm()
        email_form.fields['subject'].initial = dict(TEMPLATES)[template]
        if voter:
            email_form.fields['send_to'].widget = \
                email_form.fields['send_to'].hidden_widget()
    else:
        email_form = EmailVotersForm(request.POST)
        if email_form.is_valid():
            # the client knows to submit only once with a specific voter_id
            voter_constraints_include = None
            voter_constraints_exclude = None
            update_booth_invitation_date = False
            if template == 'vote':
                update_booth_invitation_date = True

            if voter:
                voter_constraints_include = {'uuid': voter.uuid}

            # exclude those who have not voted
            if email_form.cleaned_data['send_to'] == 'voted':
                voter_constraints_exclude = {'vote_hash' : None}

            # include only those who have not voted
            if email_form.cleaned_data['send_to'] == 'not-voted':
                voter_constraints_include = {'vote_hash': None}

            for _poll in polls:
                if not _poll.feature_can_send_voter_mail:
                    continue

                if template == 'vote' and not \
                        _poll.feature_can_send_voter_booth_invitation:
                    continue

                subject_template = 'email/%s_subject.txt' % template
                body_template = 'email/%s_body.txt' % template
                extra_vars = {
                    'custom_subject' : email_form.cleaned_data['subject'],
                    'custom_message' : email_form.cleaned_data['body'],
                    'election_url' : election_url,
                }
                task_kwargs = {
                    'subject_template': subject_template,
                    'body_template': body_template,
                    'extra_vars': extra_vars,
                    'voter_constraints_include': voter_constraints_include,
                    'voter_constraints_exclude': voter_constraints_exclude,
                    'update_date': True,
                    'update_booth_invitation_date': update_booth_invitation_date,
                    'q_param': q_param,
                }
                log_obj = election
                if poll:
                    log_obj = poll
                if voter:
                    log_obj.logger.info("Notifying single voter %s, [template: %s, filter: %s]",
                                     voter.voter_login_id, template, q_param)
                else:
                    log_obj.logger.info("Notifying voters, [template: %s, filter: %r]", template, q_param)
                tasks.voters_email.delay(_poll.pk, **task_kwargs)

            filters = get_voters_filters_with_constraints(q_param,
                        voter_constraints_include, voter_constraints_exclude)
            send_to = filtered_voters.filter(filters)
            if q_param and not send_to.filter(filters).count():
                msg = "No voters matched your filters. No emails were sent."
                messages.error(request, _(msg))
            else:
                messages.info(request, _("Email sending started"))

            url = election_reverse(election, 'polls_list')
            if poll:
                url = poll_reverse(poll, 'voters')
            if q_param:
                url += '?q=%s' % urllib.quote_plus(q_param)
            return HttpResponseRedirect(url)

    context = {
        'email_form': email_form,
        'election': election,
        'poll': poll,
        'voter_o': voter,
        'default_subject': default_subject,
        'default_body': default_body,
        'template': template,
        'filtered_voters': filtered_voters,
        'templates': TEMPLATES
    }
    set_menu('voters', context)
    if not poll:
        set_menu('polls', context)
    return render_template(request, "voters_email", context)
Ejemplo n.º 7
0
def reporting(request):

    local_timezone = pytz.timezone(TIME_ZONE)

    # load/set defaults
    start_date = request.GET.get('start_date')
    end_date = request.GET.get('end_date')

    signup_start_date = request.GET.get('signup_start_date')
    signup_end_date = request.GET.get('signup_end_date')

    order_start_date = request.GET.get('order_start_date')
    order_end_date = request.GET.get('order_end_date')

    # Convert strings to local timezone datetimes
    start_date, end_date, desc = fix_date_range(start_date, end_date)
    signup_start_date, signup_end_date, signup_desc = fix_date_range(signup_start_date, signup_end_date)
    order_start_date, order_end_date, order_desc = fix_date_range(order_start_date, order_end_date)

    buyers_all = Buyer.objects.all()
    buyers_active = Buyer.objects.filter(
        userprofile__site=request.user.userprofile.site,
        userprofile__approved=True,
    )
    vendors_all = Vendor.objects.all()
    vendors_active = Vendor.objects.filter(
        userprofile__site=request.user.userprofile.site,
        userprofile__approved=True,
    )

    report = request.GET.get('report')

    # initialize data
    orders = []
    output = []
    output_text = ''
    csv_text = ''
    table_text = ''
    filter = []
    filter2= []
    totals = []
    report_header = ''
    column_headers = []
    column_fields = []

    data = ''

    if report in ['buyer_all', 'vendor_all']:
        if report == 'buyer_all':
            as_buyer = True
        else:
            as_buyer = False

        # Build report data
        if as_buyer:
            query = buyers_all
            report_header = 'Buyers - All %s' % ', '.join(filter)
            column_headers = ['Buyer', 'Username', 'Signup Date']
        else:
            query = vendors_all
            report_header = 'Vendors - All %s' % ', '.join(filter)
            column_headers = ['Vendor', 'Username', 'Signup Date']

        query, filter = apply_report_filters(request, query)

        data = query
        # obj = Buyer or Vendor
        column_fields = ['obj.name', 'obj.userprofile.user.username', 'obj.created.strftime("%m-%d-%Y")']
        filter = []

    elif report in ['new_buyer_no_purchases', 'buyer_inactive', 'new_vendor_no_sales', 'vendor_inactive']:
        if report in ['new_buyer_no_purchases', 'buyer_inactive']:
            as_buyer = True
        else:
            as_buyer = False

        company_orders = []
        company_no_orders = []

        if as_buyer:
            query = buyers_all
        else:
            query = vendors_all

        query, filter = apply_report_filters(request, query)

        for company in query:
            if as_buyer:
                try:
                    orders = Order.objects.filter(buyer = company.userprofile.user, state=COMPLETED)
                except:
                    orders = EmptyQuerySet()
            else:
                try:
                    orders = Order.objects.filter(vendor = company, state=COMPLETED)
                except:
                    orders = EmptyQuerySet()

            orders, filter2 = apply_order_filters(request, orders)

            num_orders = len(orders)

            if num_orders == 0:
                company_no_orders.append(company)
            else:
                company_orders.append(company)

        if filter2:
            filter += filter2

        if as_buyer:
            if report in ['new_buyer_no_purchases']:
                report_header = 'New Buyers - No Purchases - %s' % ', '.join(filter)
            else:
                report_header = 'Inactive Buyers - No Purchases - %s' % ', '.join(filter)

            column_headers = ['Buyer', 'Username', 'Signup Date']
        else:
            if report in ['new_buyer_no_purchases']:
                report_header = 'New Vendors - No Sales - %s' % ', '.join(filter)
            else:
                report_header = 'Inactive Vendors - No Sales- %s' % ', '.join(filter)

            column_headers = ['Vendor', 'Username', 'Signup Date']

        # Build report data
        data = company_no_orders
        # obj = Buyer
        column_fields = ['obj.name', 'obj.userprofile.user.username', 'obj.created.strftime("%m-%d-%Y")']
        if report in ['new_buyer_no_purchases', 'new_vendor_no_sales']:
            filter = ['signup_date']
        else:
            filter = ['signup_date', 'order_date']

    elif report in ['buyer_search', 'vendor_search']:
        if report in ['buyer_search']:
            as_buyer = True
        else:
            as_buyer = False

        company_no_orders = []
        company_orders = []

        if as_buyer:
            query = buyers_all
        else:
            query = vendors_all

        query, filter = apply_report_filters(request, query)

        # Build report data
        data = query

        if as_buyer:
            report_header = 'Buyer Search - %s' % ', '.join(filter)
            column_headers = ['Buyer', 'Username', 'Created', 'City', 'State', 'Zip']
        else:
            report_header = 'Vendor Search - %s' % ', '.join(filter)
            column_headers = ['Vendor', 'Username', 'Created', 'City', 'State', 'Zip']

        # obj = Buyer or Vendor
        column_fields = ['obj.name', 'obj.userprofile.user.username', 'obj.created.strftime("%m-%d-%Y")', 'obj.city', 'obj.state', 'obj.zip']
        filter = ['signup_date', 'location', 'username']

    elif report in ['order_summary_by_buyer']:
        if report == 'order_summary_by_buyer':
            as_buyer = True
        else:
            as_buyer = False

        data = []

        if as_buyer:
            query= buyers_all
        else:
            query= vendors_all

        query, filter = apply_report_filters(request, query)

        for company in query:
            min = 9999999
            max = 0
            count = 0
            total = 0
            avg = 0
            min_date = datetime(3000,1,1).replace(tzinfo=utc)
            max_date = datetime(2000,1,1).replace(tzinfo=utc)

            if as_buyer:
                try:
                    orders = Order.objects.filter(buyer=company.userprofile.user)
                except:
                    orders = EmptyQuerySet()
            else:
                try:
                    orders = Order.objects.filter(vendor=company)
                except:
                    orders = EmptyQuerySet()

            orders = orders.filter(state=COMPLETED, date_confirmed__isnull=False)
            orders, filter2 = apply_order_filters(request, orders)

            if orders:
                for o in orders:
                    o_total = o.total    # cache so we don't have to keep re-calling this VERY expensive @property
                    count += 1
                    total += o_total
                    if o_total < min:
                        min = o_total
                    if o_total > max:
                        max = o_total
                    if o.date_confirmed < min_date:
                        min_date = o.date_confirmed
                    if o.date_confirmed > max_date:
                        max_date = o.date_confirmed
                avg = round(total / count, 2)

            # Can't do these without an actual order total db field
            # count = orders.aggregate(Count('order_total'))['order_total__count']
            # total = orders.aggregate(Sum('order_total'))['order_total__sum']
            # avg = orders.aggregate(Avg('order_total'))['order_total__avg']
            # min = orders.aggregate(Min('order_total'))['order_total__min']
            # max = orders.aggregate(Max('order_total'))['order_total__max']
            # min_date = orders.aggregate(Min('date_confirmed'))['date_confirmed__min']
            # max_date = orders.aggregate(Max('date_confirmed'))['date_confirmed__max']

            if count:
                data.append({
                    'company' : company,
                    'total' : total,
                    'count' : count,
                    'avg'   : avg,
                    'min'   : min,
                    'max'   : max,
                    'min_date' : min_date,
                    'max_date' : max_date,
                })

        filter += filter2 # add report and order filter descriptions
        report_header = 'Order Summary by %s - %s' % ('Buyer' if as_buyer else 'Vendor', ', '.join(filter))
        column_headers = [
            'Buyer' if as_buyer else 'Vendor',
            'Username',
            'Created',
            'First Order',
            'Last Order'
            '# Orders',
            'Total $',
            'Avg $',
            'Min $',
            'Max $',
        ]
        # obj = Vendor
        column_fields = [
            "obj['company'].name",
            "obj['company'].userprofile.user.username",
            "obj['company'].created.strftime('%m-%d-%Y')",
            "obj['min_date'].strftime('%m-%d-%Y')",
            "obj['max_date'].strftime('%m-%d-%Y')",
            "obj['count']",
            "obj['total']",
            "obj['avg']",
            "obj['min']",
            "obj['max']",
        ]

        filter = ['order_date', 'buyer', 'location', 'username', 'note_slow']

    elif report in ['order_details_by_buyer', 'order_details_by_vendor']:
        if report == 'order_details_by_buyer':
            as_buyer = True
        else:
            as_buyer = False

        data = []

        if as_buyer:
            query= buyers_all
        else:
            query= vendors_all

        query, filter = apply_report_filters(request, query)

        for company in query:
            min = 9999999
            max = 0
            count = 0
            total = 0
            avg = 0
            min_date = datetime(3000,1,1).replace(tzinfo=utc)
            max_date = datetime(2000,1,1).replace(tzinfo=utc)

            if as_buyer:
                try:
                    orders = Order.objects.filter(buyer=company.userprofile.user)
                except:
                    orders = EmptyQuerySet()
            else:
                try:
                    orders = Order.objects.filter(vendor=company)
                except:
                    orders = EmptyQuerySet()

            orders = orders.filter(state=COMPLETED, date_confirmed__isnull=False)
            orders, filter2 = apply_order_filters(request, orders)

            if orders:
                for o in orders:
                    data.append(o)

        filter += filter2 # add report and order filter descriptions
        report_header = 'Order Details by %s - %s' % ('Buyer' if as_buyer else 'Vendor', ', '.join(filter))
        column_headers = [
            'Buyer' if as_buyer else 'Vendor',
            'Vendor' if as_buyer else 'Buyer',
            'Order',
            'Subtotal',
            'Shipping',
            'Total',
            'Confirmed',
            'Delivery Type',
            'Delivery Date',
            'Ratings',
            '# Items',
            'Categories/#',
        ]

        # obj = Vendor
        column_fields = [
            "obj.buyer.userprofile.buyer.name" if as_buyer else "obj.vendor.name",
            "obj.vendor.name" if as_buyer else "obj.buyer.userprofile.buyer.name",
            "obj.uniqueId",
            "obj.sub_total",
            "obj.shipping",
            "obj.total",
            "obj.date_confirmed.replace(tzinfo=local_timezone).strftime('%m-%d-%Y %H:%M')",
            "DELIVERY_OPTION_DICT[obj.delivery_option]",
            "obj.delivery_date.strftime('%m-%d-%Y') if obj.delivery_date else ''",
            "'%s / %s' % (obj.buyer_rating, obj.vendor_rating)" if as_buyer else "'%s / %s' % (obj.vendor_rating, obj.buyer_rating)",
            "obj.entry_set.count()",
            "obj.categories_count",
        ]

        filter = ['signup_date', 'order_date', 'buyer', 'vendor', 'location', 'note_slow']


    else:
        # Report not found
        pass

    #################################
    # Process the report
    #################################

    # process the report if one is specified
    if data and report:
        csv_text = data_as_csv(data, report_header, column_headers, column_fields)
        table_text = data_as_table(data, report_header, column_headers, column_fields)

        if (request.GET.get('csv')):
            filename = "%s-%s.csv" % (request.site.name, report)

            response = HttpResponse(
                csv_text,
                mimetype = 'text/csv;',
            )
            response['Content-Disposition'] = 'attachment;filename=%s' % (filename)
            return response

    context = {
        # "start_date"          : start_date.astimezone(pytz.timezone('US/Eastern')),
        # "end_date"            : end_date.astimezone(pytz.timezone('US/Eastern')),
        # "signup_start_date"   : signup_start_date.astimezone(pytz.timezone('US/Eastern')),
        # "signup_end_date"     : signup_end_date.astimezone(pytz.timezone('US/Eastern')),
        # "order_start_date"    : order_start_date.astimezone(pytz.timezone('US/Eastern')),
        # "order_end_date"      : order_end_date.astimezone(pytz.timezone('US/Eastern')),
        # "reports"           : reports,
        "report"              : report,
        "buyers_active"       : buyers_active,
        "vendors_active"      : vendors_active,
        "orders"              : orders,
        "data"                : data,
        "output"              : output,
        "output_text"         : table_text,
        "output_rows"         : len(data),
        "csv_url"             : "%s?%s&csv=1" % (request.path, request.META.get('QUERY_STRING')),
        "filter"              : filter,
        "date_ranges"         : DATE_RANGES,
        # "output_text"       : csv_text,
    }

    return render_to_response(
        "reporting.html",
        context,
        context_instance = RequestContext(request)
    )
Ejemplo n.º 8
0
Archivo: poll.py Proyecto: grnet/zeus
def voters_email(request, election, poll=None, voter_uuid=None):
    user = request.admin

    TEMPLATES = [("vote", _("Time to Vote")), ("info", _("Additional Info"))]

    default_template = "vote"

    if not election.any_poll_feature_can_send_voter_mail:
        raise PermissionDenied("34")

    if not election.any_poll_feature_can_send_voter_booth_invitation:
        TEMPLATES.pop(0)
        default_template = "info"

    if election.voting_extended_until and not election.voting_ended_at:
        TEMPLATES.append(("extension", _("Voting end date extended")))

    template = request.REQUEST.get("template", default_template)

    if not template in [t[0] for t in TEMPLATES]:
        raise Exception("bad template")

    polls = [poll]
    if not poll:
        polls = election.polls_by_link_id

    voter = None
    if voter_uuid:
        try:
            if poll:
                voter = get_object_or_404(Voter, uuid=voter_uuid, poll=poll)
            else:
                voter = get_object_or_404(Voter, uuid=voter_uuid, election=election)
        except Voter.DoesNotExist:
            raise PermissionDenied("35")
        if not voter:
            url = election_reverse(election, "index")
            return HttpResponseRedirect(url)

    election_url = election.get_absolute_url()

    default_subject = render_to_string("email/%s_subject.txt" % template, {"custom_subject": "&lt;SUBJECT&gt;"})

    default_body = render_to_string(
        "email/%s_body.txt" % template,
        {
            "election": election,
            "election_url": election_url,
            "custom_subject": default_subject,
            "custom_message": "&lt;BODY&gt;",
            "voter": {
                "vote_hash": "<SMART_TRACKER>",
                "name": "<VOTER_NAME>",
                "voter_name": "<VOTER_NAME>",
                "voter_surname": "<VOTER_SURNAME>",
                "voter_login_id": "<VOTER_LOGIN_ID>",
                "voter_password": "******",
                "audit_passwords": "1",
                "get_audit_passwords": ["pass1", "pass2", "..."],
                "get_quick_login_url": "<VOTER_LOGIN_URL>",
                "poll": poll,
                "election": election,
            },
        },
    )

    q_param = request.GET.get("q", None)

    filtered_voters = election.voters.filter()
    if poll:
        filtered_voters = poll.voters.filter()

    if not q_param:
        filtered_voters = EmptyQuerySet()
    else:
        voters_filters = get_filters(
            q_param, VOTER_TABLE_HEADERS, VOTER_SEARCH_FIELDS, VOTER_BOOL_KEYS_MAP, VOTER_EXTRA_HEADERS
        )
        filtered_voters = filtered_voters.filter(voters_filters)

        if not filtered_voters.count():
            message = _("No voters were found.")
            messages.error(request, message)
            url = election_reverse(election, "polls_list")
            return HttpResponseRedirect(url)

    if request.method == "GET":
        email_form = EmailVotersForm()
        email_form.fields["subject"].initial = dict(TEMPLATES)[template]
        if voter:
            email_form.fields["send_to"].widget = email_form.fields["send_to"].hidden_widget()
    else:
        email_form = EmailVotersForm(request.POST)
        if email_form.is_valid():
            # the client knows to submit only once with a specific voter_id
            voter_constraints_include = None
            voter_constraints_exclude = None
            update_booth_invitation_date = False
            if template == "vote":
                update_booth_invitation_date = True

            if voter:
                voter_constraints_include = {"uuid": voter.uuid}

            # exclude those who have not voted
            if email_form.cleaned_data["send_to"] == "voted":
                voter_constraints_exclude = {"vote_hash": None}

            # include only those who have not voted
            if email_form.cleaned_data["send_to"] == "not-voted":
                voter_constraints_include = {"vote_hash": None}

            for _poll in polls:
                if not _poll.feature_can_send_voter_mail:
                    continue

                if template == "vote" and not _poll.feature_can_send_voter_booth_invitation:
                    continue

                subject_template = "email/%s_subject.txt" % template
                body_template = "email/%s_body.txt" % template
                extra_vars = {
                    "custom_subject": email_form.cleaned_data["subject"],
                    "custom_message": email_form.cleaned_data["body"],
                    "election_url": election_url,
                }
                task_kwargs = {
                    "subject_template": subject_template,
                    "body_template": body_template,
                    "extra_vars": extra_vars,
                    "voter_constraints_include": voter_constraints_include,
                    "voter_constraints_exclude": voter_constraints_exclude,
                    "update_date": True,
                    "update_booth_invitation_date": update_booth_invitation_date,
                    "q_param": q_param,
                }
                log_obj = election
                if poll:
                    log_obj = poll
                if voter:
                    log_obj.logger.info(
                        "Notifying single voter %s, [template: %s, filter: %s]", voter.voter_login_id, template, q_param
                    )
                else:
                    log_obj.logger.info("Notifying voters, [template: %s, filter: %r]", template, q_param)
                tasks.voters_email.delay(_poll.pk, **task_kwargs)

            filters = get_voters_filters_with_constraints(q_param, voter_constraints_include, voter_constraints_exclude)
            send_to = filtered_voters.filter(filters)
            if q_param and not send_to.filter(filters).count():
                msg = "No voters matched your filters. No emails were sent."
                messages.error(request, _(msg))
            else:
                messages.info(request, _("Email sending started"))

            url = election_reverse(election, "polls_list")
            if poll:
                url = poll_reverse(poll, "voters")
            if q_param:
                url += "?q=%s" % urllib.quote_plus(q_param)
            return HttpResponseRedirect(url)

    context = {
        "email_form": email_form,
        "election": election,
        "poll": poll,
        "voter_o": voter,
        "default_subject": default_subject,
        "default_body": default_body,
        "template": template,
        "filtered_voters": filtered_voters,
        "templates": TEMPLATES,
    }
    set_menu("voters", context)
    if not poll:
        set_menu("polls", context)
    return render_template(request, "voters_email", context)