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}))
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}))
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 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)
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)
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'],])