Пример #1
0
def bid(request, id):
    job = get_object_or_404(JobPosting, id=id)

    bid, created = JobInterest.objects.get_or_create(user=request.user,
                                                     job=job)

    if request.POST.get('statement', None):
        bid.statement = request.POST['statement']
        bid.save()

    context = {"user": request.user, "job": job, "bid": bid}
    subject = render_to_string("jobboard/emails/bid_subject.txt", context)
    body = render_to_string("jobboard/emails/bid_body.txt", context)

    subject = "".join(subject.splitlines())
    send_mail(subject=subject,
              htmlMessage=body,
              fromemail='"Engineers Without Borders" <*****@*****.**>',
              recipients=[job.owner.email],
              use_template=False)

    request.user.message_set.create(message='You have bid for this job.')
    if request.is_ajax:
        return HttpResponseRedirect(
            reverse('jobboard_detail_ajax', kwargs={'id': job.id}))
    else:
        return HttpResponseRedirect(
            reverse('jobboard_detail_ajax', kwargs={'id': job.id}))
Пример #2
0
def bid(request, id):
    job = get_object_or_404(JobPosting, id=id)

    bid, created = JobInterest.objects.get_or_create(user=request.user, job=job)

    if request.POST.get("statement", None):
        bid.statement = request.POST["statement"]
        bid.save()

    context = {"user": request.user, "job": job, "bid": bid}
    subject = render_to_string("jobboard/emails/bid_subject.txt", context)
    body = render_to_string("jobboard/emails/bid_body.txt", context)

    subject = "".join(subject.splitlines())
    send_mail(
        subject=subject,
        htmlMessage=body,
        fromemail='"Engineers Without Borders" <*****@*****.**>',
        recipients=[job.owner.email],
        use_template=False,
    )

    request.user.message_set.create(message="You have bid for this job.")
    if request.is_ajax:
        return HttpResponseRedirect(reverse("jobboard_detail_ajax", kwargs={"id": job.id}))
    else:
        return HttpResponseRedirect(reverse("jobboard_detail_ajax", kwargs={"id": job.id}))
Пример #3
0
def reset_password(request, key=None):
    context = {}

    if request.method == "POST" and request.POST.get("email", None):
        if request.user.is_authenticated():
            return HttpResponseRedirect(reverse("conference_schedule"))

        email = request.POST.get("email", None)
        if User.objects.filter(email__iexact=email).count():
            context["email"] = email
        else:
            context["email_error"] = email

        for user in User.objects.filter(email__iexact=email):
            temp_key = sha_constructor("%s%s%s" % (settings.SECRET_KEY, user.email, settings.SECRET_KEY)).hexdigest()

            # save it to the password reset model
            password_reset = PasswordReset(user=user, temp_key=temp_key)
            password_reset.save()

            current_site = Site.objects.get_current()
            domain = unicode(current_site.domain)

            # send the password reset email
            subject = "myEWB password reset"
            message = render_to_string(
                "conference/schedule/password_reset_message.txt", {"user": user, "temp_key": temp_key, "domain": domain}
            )
            send_mail(
                subject=subject,
                txtMessage=message,
                fromemail=settings.DEFAULT_FROM_EMAIL,
                recipients=[user.email],
                priority="high",
            )

    elif key:
        if PasswordReset.objects.filter(temp_key__exact=key, reset=False).count():
            if request.method == "POST":
                form = ResetPasswordKeyForm(request.POST)

                if form.is_valid():
                    # get the password_reset object
                    temp_key = form.cleaned_data.get("temp_key")
                    password_reset = PasswordReset.objects.filter(temp_key__exact=temp_key, reset=False)
                    password_reset = password_reset[0]  # should always be safe, as form_clean checks this

                    # now set the new user password
                    user = User.objects.get(passwordreset__exact=password_reset)
                    result = user.set_password(form.cleaned_data["password1"])

                    if not result:
                        # unsuccessful
                        form._errors[forms.forms.NON_FIELD_ERRORS] = ["Error (password is too simple maybe?)"]
                    else:
                        user.save()

                        # change all the password reset records to this person to be true.
                        for password_reset in PasswordReset.objects.filter(user=user):
                            password_reset.reset = True
                            password_reset.save()

                        user = auth.authenticate(username=user.username, password=form.cleaned_data["password1"])
                        auth.login(request, user)
                        return HttpResponseRedirect(reverse("conference_schedule"))
            else:
                form = ResetPasswordKeyForm(initial={"temp_key": key})

            context["keyvalid"] = True
            context["form"] = form
        else:
            context["keyerror"] = True

    else:
        return HttpResponseRedirect(reverse("conference_schedule_login"))

    return render_to_response("conference/schedule/reset.html", context, context_instance=RequestContext(request))
Пример #4
0
def reset_password(request, key=None):
    context = {}

    if request.method == 'POST' and request.POST.get('email', None):
        if request.user.is_authenticated():
            return HttpResponseRedirect(reverse('conference_schedule'))

        email = request.POST.get('email', None)
        if User.objects.filter(email__iexact=email).count():
            context['email'] = email
        else:
            context['email_error'] = email

        for user in User.objects.filter(email__iexact=email):
            temp_key = sha_constructor("%s%s%s" % (
                settings.SECRET_KEY,
                user.email,
                settings.SECRET_KEY,
            )).hexdigest()

            # save it to the password reset model
            password_reset = PasswordReset(user=user, temp_key=temp_key)
            password_reset.save()

            current_site = Site.objects.get_current()
            domain = unicode(current_site.domain)

            #send the password reset email
            subject = "myEWB password reset"
            message = render_to_string(
                "conference/schedule/password_reset_message.txt", {
                    "user": user,
                    "temp_key": temp_key,
                    "domain": domain,
                })
            send_mail(subject=subject,
                      txtMessage=message,
                      fromemail=settings.DEFAULT_FROM_EMAIL,
                      recipients=[user.email],
                      priority="high")

    elif key:
        if PasswordReset.objects.filter(temp_key__exact=key,
                                        reset=False).count():
            if request.method == 'POST':
                form = ResetPasswordKeyForm(request.POST)

                if form.is_valid():
                    # get the password_reset object
                    temp_key = form.cleaned_data.get("temp_key")
                    password_reset = PasswordReset.objects.filter(
                        temp_key__exact=temp_key, reset=False)
                    password_reset = password_reset[
                        0]  # should always be safe, as form_clean checks this

                    # now set the new user password
                    user = User.objects.get(
                        passwordreset__exact=password_reset)
                    result = user.set_password(form.cleaned_data['password1'])

                    if not result:
                        # unsuccessful
                        form._errors[forms.forms.NON_FIELD_ERRORS] = [
                            "Error (password is too simple maybe?)"
                        ]
                    else:
                        user.save()

                        # change all the password reset records to this person to be true.
                        for password_reset in PasswordReset.objects.filter(
                                user=user):
                            password_reset.reset = True
                            password_reset.save()

                        user = auth.authenticate(
                            username=user.username,
                            password=form.cleaned_data['password1'])
                        auth.login(request, user)
                        return HttpResponseRedirect(
                            reverse('conference_schedule'))
            else:
                form = ResetPasswordKeyForm(initial={'temp_key': key})

            context['keyvalid'] = True
            context['form'] = form
        else:
            context['keyerror'] = True

    else:
        return HttpResponseRedirect(reverse('conference_schedule_login'))

    return render_to_response("conference/schedule/reset.html",
                              context,
                              context_instance=RequestContext(request))
    def handle_noargs(self, **options):
        msgs = []

        yesterday = date.today() - timedelta(days=1)
        oneday = date.today()
        oneweek = date.today() + timedelta(days=7)
        onemonth = date.today() + timedelta(days=31)

        profiles_expired = MemberProfile.objects.filter(
            membership_expiry=yesterday, user2__is_active=True)
        profiles_oneday = MemberProfile.objects.filter(
            membership_expiry=oneday, user2__is_active=True)
        profiles_oneweek = MemberProfile.objects.filter(
            membership_expiry=oneweek, user2__is_active=True)
        profiles_onemonth = MemberProfile.objects.filter(
            membership_expiry=onemonth, user2__is_active=True)

        emails = []

        msgs.append("Expiry reminders: %d" % profiles_expired.count())
        for p in profiles_expired:
            context = {"user": p.user2, "profile": p}

            subject = render_to_string(
                "profiles/emails/membership_expiry_subject.txt", context)
            body = render_to_string(
                "profiles/emails/membership_expiry_body.txt", context)
            emails.append((subject, body, p.user2.email))

        msgs.append("One day reminders: %d" % profiles_oneday.count())
        for p in profiles_oneday:
            context = {"user": p.user2, "profile": p}

            subject = render_to_string(
                "profiles/emails/membership_oneday_subject.txt", context)
            body = render_to_string(
                "profiles/emails/membership_oneday_body.txt", context)
            emails.append((subject, body, p.user2.email))

        msgs.append("One week reminders: %d" % profiles_oneweek.count())
        for p in profiles_oneweek:
            context = {"user": p.user2, "profile": p}

            subject = render_to_string(
                "profiles/emails/membership_oneweek_subject.txt", context)
            body = render_to_string(
                "profiles/emails/membership_oneweek_body.txt", context)
            emails.append((subject, body, p.user2.email))

        msgs.append("One month reminders: %d" % profiles_onemonth.count())
        for p in profiles_onemonth:
            context = {"user": p.user2, "profile": p}

            subject = render_to_string(
                "profiles/emails/membership_onemonth_subject.txt", context)
            body = render_to_string(
                "profiles/emails/membership_onemonth_body.txt", context)
            emails.append((subject, body, p.user2.email))

        for subject, body, email in emails:
            subject = "".join(subject.splitlines())
            send_mail(subject=subject,
                      htmlMessage=body,
                      fromemail='"Engineers Without Borders" <*****@*****.**>',
                      recipients=[email],
                      use_template=False)

        return '\n'.join(msgs)
Пример #6
0
    def handle_noargs(self, **options):
        msgs = []
        emails = []

        yesterday = date.today() - timedelta(days=1)
        
        jobs = JobPosting.objects.open()
        jobs = jobs.filter(last_updated__gt=yesterday)
        jobs = jobs.filter()
        msgs.append("total updated jobs: %d" % jobs.count())
        
        users = User.objects.filter(jobfilter__email=True).distinct()
        msgs.append("total users: %d" % users.count())
        msgs.append("")
        
        for u in users:
            filters = JobFilter.objects.filter(user=u, email=True)
            alljobs = []
            
            for filter in filters:
                myjobs = jobs.all()
                
                # the easy ones
                if filter.deadline_comparison == 'lt':
                    myjobs = myjobs.filter(deadline__lte=filter.deadline)
                elif filter.deadline_comparison == 'gt':
                    myjobs = myjobs.filter(deadline__gte=filter.deadline)
                
                if filter.urgency_comparison == 'lt':
                    myjobs = myjobs.filter(urgency__lte=filter.urgency)
                elif filter.urgency_comparison == 'gt':
                    myjobs = myjobs.filter(urgency__gte=filter.urgency)
                
                if filter.time_required_comparison == 'lt':
                    myjobs = myjobs.filter(time_required__lte=filter.time_required)
                elif filter.time_required_comparison == 'gt':
                    myjobs = myjobs.filter(time_required__gte=filter.time_required)
                    
                # skills, such a pain
                if filter.skills_comparison:
                        if filter.skills_comparison == 'any':
                            myjobs = myjobs.filter(skills__in=filter.skills.all()).distinct()
                        elif filter.skills_comparison == 'all':
                            for skill in filter.skills:
                                myjobs = myjobs.filter(skills__id=skill)
                        else:
                            myjobs = myjobs.exclude(skills__in=filter.skills.all())
            
                # and locations
                if filter.location_comparison:
                    if filter.location_comparison == 'oneof':     # validate deadline2 too!
                        myjobs = myjobs.filter(location__in=filter.location).distinct()
            
                # search terms...
                if filter.search:
                    myjobs = myjobs.filter(Q(description__icontains=filter.search) | Q(name__icontains=filter.search)).distinct()
                    
                if myjobs.count():
                    alljobs.extend(myjobs)
                    
            if len(alljobs):
                uniquejobs = list(set(alljobs))
                
                context = {"user": u,
                           "jobs": uniquejobs}
                subject = render_to_string("jobboard/emails/updates_subject.txt", context)
                body = render_to_string("jobboard/emails/updates_body.txt", context)
                emails.append((subject, body, u.email))
                
                msgs.append("%s (%d filters, %d jobs, %d unique)" % (u.visible_name(), filters.count(), len(alljobs), len(uniquejobs)))
        
        for subject, body, email in emails:
            subject = "".join(subject.splitlines())
            send_mail(subject=subject,
                      htmlMessage=body,
                      fromemail='"Engineers Without Borders" <*****@*****.**>',
                      recipients=[email],
                      use_template=False)
        
        return '\n'.join(msgs)
    def handle_noargs(self, **options):
        msgs = []

        yesterday = date.today() - timedelta(days=1)
        oneday = date.today()
        oneweek = date.today() + timedelta(days=7)
        onemonth = date.today() + timedelta(days=31)
        
        profiles_expired = MemberProfile.objects.filter(membership_expiry=yesterday,
                                                        user2__is_active=True)
        profiles_oneday = MemberProfile.objects.filter(membership_expiry=oneday,
                                                       user2__is_active=True)
        profiles_oneweek = MemberProfile.objects.filter(membership_expiry=oneweek,
                                                        user2__is_active=True)
        profiles_onemonth = MemberProfile.objects.filter(membership_expiry=onemonth,
                                                         user2__is_active=True)

        emails = []

        msgs.append("Expiry reminders: %d" % profiles_expired.count())
        for p in profiles_expired:
            context = {"user": p.user2,
                       "profile": p}
        
            subject = render_to_string("profiles/emails/membership_expiry_subject.txt", context)
            body = render_to_string("profiles/emails/membership_expiry_body.txt", context)
            emails.append((subject, body, p.user2.email))
            
        msgs.append("One day reminders: %d" % profiles_oneday.count())
        for p in profiles_oneday:
            context = {"user": p.user2,
                       "profile": p}
        
            subject = render_to_string("profiles/emails/membership_oneday_subject.txt", context)
            body = render_to_string("profiles/emails/membership_oneday_body.txt", context)
            emails.append((subject, body, p.user2.email))
            
        msgs.append("One week reminders: %d" % profiles_oneweek.count())
        for p in profiles_oneweek:
            context = {"user": p.user2,
                       "profile": p}
        
            subject = render_to_string("profiles/emails/membership_oneweek_subject.txt", context)
            body = render_to_string("profiles/emails/membership_oneweek_body.txt", context)
            emails.append((subject, body, p.user2.email))
            
        msgs.append("One month reminders: %d" % profiles_onemonth.count())
        for p in profiles_onemonth:
            context = {"user": p.user2,
                       "profile": p}
        
            subject = render_to_string("profiles/emails/membership_onemonth_subject.txt", context)
            body = render_to_string("profiles/emails/membership_onemonth_body.txt", context)
            emails.append((subject, body, p.user2.email))

        for subject, body, email in emails:
            subject = "".join(subject.splitlines())
            send_mail(subject=subject,
                      htmlMessage=body,
                      fromemail='"Engineers Without Borders" <*****@*****.**>',
                      recipients=[email],
                      use_template=False)

        return '\n'.join(msgs)
    def handle_noargs(self, **options):
        msgs = []
        emails = []

        yesterday = date.today() - timedelta(days=1)

        jobs = JobPosting.objects.open()
        jobs = jobs.filter(last_updated__gt=yesterday)
        jobs = jobs.filter()
        msgs.append("total updated jobs: %d" % jobs.count())

        users = User.objects.filter(jobfilter__email=True).distinct()
        msgs.append("total users: %d" % users.count())
        msgs.append("")

        for u in users:
            filters = JobFilter.objects.filter(user=u, email=True)
            alljobs = []

            for filter in filters:
                myjobs = jobs.all()

                # the easy ones
                if filter.deadline_comparison == 'lt':
                    myjobs = myjobs.filter(deadline__lte=filter.deadline)
                elif filter.deadline_comparison == 'gt':
                    myjobs = myjobs.filter(deadline__gte=filter.deadline)

                if filter.urgency_comparison == 'lt':
                    myjobs = myjobs.filter(urgency__lte=filter.urgency)
                elif filter.urgency_comparison == 'gt':
                    myjobs = myjobs.filter(urgency__gte=filter.urgency)

                if filter.time_required_comparison == 'lt':
                    myjobs = myjobs.filter(
                        time_required__lte=filter.time_required)
                elif filter.time_required_comparison == 'gt':
                    myjobs = myjobs.filter(
                        time_required__gte=filter.time_required)

                # skills, such a pain
                if filter.skills_comparison:
                    if filter.skills_comparison == 'any':
                        myjobs = myjobs.filter(
                            skills__in=filter.skills.all()).distinct()
                    elif filter.skills_comparison == 'all':
                        for skill in filter.skills:
                            myjobs = myjobs.filter(skills__id=skill)
                    else:
                        myjobs = myjobs.exclude(skills__in=filter.skills.all())

                # and locations
                if filter.location_comparison:
                    if filter.location_comparison == 'oneof':  # validate deadline2 too!
                        myjobs = myjobs.filter(
                            location__in=filter.location).distinct()

                # search terms...
                if filter.search:
                    myjobs = myjobs.filter(
                        Q(description__icontains=filter.search)
                        | Q(name__icontains=filter.search)).distinct()

                if myjobs.count():
                    alljobs.extend(myjobs)

            if len(alljobs):
                uniquejobs = list(set(alljobs))

                context = {"user": u, "jobs": uniquejobs}
                subject = render_to_string(
                    "jobboard/emails/updates_subject.txt", context)
                body = render_to_string("jobboard/emails/updates_body.txt",
                                        context)
                emails.append((subject, body, u.email))

                msgs.append("%s (%d filters, %d jobs, %d unique)" %
                            (u.visible_name(), filters.count(), len(alljobs),
                             len(uniquejobs)))

        for subject, body, email in emails:
            subject = "".join(subject.splitlines())
            send_mail(subject=subject,
                      htmlMessage=body,
                      fromemail='"Engineers Without Borders" <*****@*****.**>',
                      recipients=[email],
                      use_template=False)

        return '\n'.join(msgs)
Пример #9
0
def parse_message(key, msg):
    try:
        # parse subject
        subject = msg['subject']
        
        # parse author: find myEWB user based on email address
        author = parse_author(msg['from'])
        
        # parse recipient: find destination group based on "to" address
        group = parse_recipient(msg['to'])
        
        # find parent message(s)
        if 'references' in msg:
            parent_object, parent_type = parse_references(msg['references'])
        else:
            parent_object, parent_type = None, None
        
        # parse body of message
        body = parse_body(msg)
            
        # ok, we now have enough info, between slug and parent_obj, to 
        # hopefully do something intelligent.
        if parent_object:
            if parent_type == ContentType.objects.get_for_model(GroupTopic):
                add_reply(parent_object, group, author, body)
               
            elif parent_type == ContentType.objects.get_for_model(ThreadedComment):
                add_reply(parent_object.content_object, group, author, body)
               
            elif parent_type == ContentType.objects.get_for_model(Message):
                add_private_msg(parent_object, author, msg)
            
        elif group:
            add_post(group, author, subject, body)
            
        else:
            raise BounceException("I don't know what to do...")
        
    except BounceException as e:
        print "bouncing email", e

        # TODO: template-ize this
        bounce_msg = """Hello,

myEWB was unable to deliver your email:

     From: %s
     To: %s

Details of the failure: 
%s

----- Original message -----

%s

""" % (msg['from'], msg['to'], e, msg)

        send_mail(subject='Delivery Status Notification - failure',
                  txtMessage=bounce_msg,
                  fromemail=settings.DEFAULT_FROM_EMAIL,
                  recipients=[msg['from'],])