Example #1
0
def generate_invites(request):
    user = request.user

    if not Invite.user_can_generate_invite(user):
        return render_to_response('generate_forbidden.html', {},
                                  context_instance=RequestContext(request))

    if request.method == 'POST':
        return generate_invites_post(request)

    courses = Course.objects.filter(is_active=True)
    groups = Group.objects.filter(year=get_current_year())
    true_courses = []
    for course in courses:
        if user in course.teachers.all():
            true_courses.append(course)

    groups = groups.filter(course__in=true_courses).distinct().order_by('name')

    context = {
        'groups': groups,
        # 'courses'   : courses,
    }

    return render_to_response('generate.html',
                              context,
                              context_instance=RequestContext(request))
Example #2
0
def profile(request, username=None, year=None):
    user = request.user

    user_to_show = user
    if username:
        user_to_show = get_object_or_404(User, username=username)

    teacher_in_courses = Course.objects.filter(is_active=True).filter(teachers=user_to_show)
    user_teacher_in_courses = Course.objects.filter(is_active=True).filter(teachers=user)
    if user_to_show != user:
        if len(teacher_in_courses) == 0 and len(user_teacher_in_courses) == 0:
            raise PermissionDenied

    if year:
        current_year = get_object_or_404(Year, start_year=year)
    else:
        current_year = get_current_year()

    tasks_taken = TaskTaken.objects.filter(user=user_to_show).filter(Q( Q(status=TaskTaken.STATUS_TAKEN) | Q(status=TaskTaken.STATUS_SCORED))).filter(task__course__is_active=True)

    course_x_tasks = {}
    course_x_scores = {}
    for task_taken in tasks_taken:
        course = task_taken.task.course
        course_x_scores.setdefault(course, 0)
        task_end_date = task_taken.added_time + datetime.timedelta(days=course.max_days_without_score)
        course_x_tasks.setdefault(course, [])
        course_x_tasks[course].append((task_taken.task, task_taken.task.score_max, task_taken.score, task_end_date))
        course_x_scores[course] += task_taken.score

    user_course_information = []
    for course in sorted(course_x_tasks.keys(), key=lambda x: x.name):
        user_course_information.append((course,course_x_scores[course],course_x_tasks[course]))

    groups = user_to_show.group_set.filter(year=current_year)
    can_generate_invites = user_to_show == user and Invite.user_can_generate_invite(user)

    issues = Issue.objects.filter(student=user_to_show).order_by('task__course')

    if request.method == 'POST':
        invite_form = InviteActivationForm(request.POST)
        if invite_form.is_valid():
            invite = get_object_or_404(Invite, key=invite_form.cleaned_data['invite'])
            if invite.group:
                invite.group.students.add(user)
                invite.invited_users.add(user)
    else:
        invite_form = InviteActivationForm()

    context = {
        'user_to_show'              : user_to_show,
        'groups'                    : groups,
        'user_course_information'   : user_course_information,
        'teacher_in_courses'        : teacher_in_courses,
        'can_generate_invites'      : can_generate_invites,
        'issues'                    : issues,
        'invite_form'               : invite_form,
    }

    return render_to_response('user_profile.html', context, context_instance=RequestContext(request))
Example #3
0
def generate_invites_post(request):
    user = request.user
    
    if 'number_of_invites' not in request.POST:
        return HttpResponseForbidden()
    
    group_id = None
    if 'group_id' in request.POST:
        try:
            group_id = int(request.POST['group_id'])
        except ValueError: #not int
            return HttpResponseForbidden()

    #if invites_not_for_group == False and group_id is None:
    #    return HttpResponseForbidden()
    
    try:
        number_of_invites = int(request.POST['number_of_invites'])
    except ValueError: #not int
        return HttpResponseForbidden()
    
    group = None

    group = get_object_or_404(Group, id = group_id)
    
    invites = Invite.generate_invites(number_of_invites, user, group)
    invite_expired_date = datetime.date.today() + datetime.timedelta(days=settings.INVITE_EXPIRED_DAYS)

    context = {
        'invites'               : invites,
        'group'                 : group, 
        'invite_expired_date'   : invite_expired_date,
    }
    
    return render_to_response('invites_list.html', context, context_instance=RequestContext(request))   
Example #4
0
    def clean_invite(self):
        """
        Validate that the invite is not already
        in use and exists.
        """

        valid, message = Invite.can_be_used(self.cleaned_data['invite'])
        if not valid:
            raise forms.ValidationError(message)
        else:
            return self.cleaned_data['invite']
Example #5
0
def generate_invites(request):
    user = request.user
    
    if not Invite.user_can_generate_invite(user):
        return render_to_response('generate_forbidden.html', {}, context_instance=RequestContext(request)) 
    
    if request.method == 'POST':
        return generate_invites_post(request)
    
    
    groups = Group.objects.filter(year=get_current_year())
    
    context = {
        'groups'    : groups,
    }
    
    return render_to_response('generate.html', context, context_instance=RequestContext(request))
Example #6
0
def profile(request, username=None, year=None):
    user = request.user

    user_to_show = user
    if username:
        user_to_show = get_object_or_404(User, username=username)

    if year:
        current_year = get_object_or_404(Year, start_year=year)
    else:
        current_year = get_current_year()

    tasks_taken = TaskTaken.objects.filter(user=user_to_show).filter(Q( Q(status=TaskTaken.STATUS_TAKEN) | Q(status=TaskTaken.STATUS_SCORED))).filter(task__cource__is_active=True)

    cource_x_tasks = {}
    cource_x_scores = {}
    for task_taken in tasks_taken:
        cource = task_taken.task.cource
        cource_x_scores.setdefault(cource, 0)
        task_end_date = task_taken.added_time + datetime.timedelta(days=cource.max_days_without_score)
        cource_x_tasks.setdefault(cource, [])
        cource_x_tasks[cource].append((task_taken.task, task_taken.task.score_max, task_taken.score, task_end_date))
        cource_x_scores[cource] += task_taken.score

    user_cource_information = []
    for cource in sorted(cource_x_tasks.keys(), key=lambda x: x.name):
        user_cource_information.append((cource,cource_x_scores[cource],cource_x_tasks[cource]))

    groups = user_to_show.group_set.filter(year=current_year)
    teacher_in_cources = Cource.objects.filter(is_active=True).filter(teachers=user_to_show)
    can_generate_invites = user_to_show == user and Invite.user_can_generate_invite(user)

    context = {
        'user_to_show'              : user_to_show,
        'groups'                    : groups,
        'user_cource_information'   : user_cource_information,
        'teacher_in_cources'        : teacher_in_cources,
        'can_generate_invites'      : can_generate_invites,
    }

    return render_to_response('user_profile.html', context, context_instance=RequestContext(request))
Example #7
0
def generate_invites_post(request):
    user = request.user

    if 'number_of_invites' not in request.POST:
        return HttpResponseForbidden()

    group_id = None
    if 'group_id' in request.POST:
        try:
            group_id = int(request.POST['group_id'])
        except ValueError:  # not int
            return HttpResponseForbidden()

    # if invites_not_for_group == False and group_id is None:
    #    return HttpResponseForbidden()

    try:
        number_of_invites = int(request.POST['number_of_invites'])
    except ValueError:  # not int
        return HttpResponseForbidden()

    group = None

    group = get_object_or_404(Group, id=group_id)

    invites = Invite.generate_invites(number_of_invites, user, group)
    invite_expired_date = datetime.date.today() + datetime.timedelta(
        days=settings.INVITE_EXPIRED_DAYS)

    context = {
        'invites': invites,
        'group': group,
        'invite_expired_date': invite_expired_date,
    }

    return render_to_response('invites_list.html',
                              context,
                              context_instance=RequestContext(request))
Example #8
0
def generate_invites(request):
    user = request.user

    if not Invite.user_can_generate_invite(user):
        return render_to_response('generate_forbidden.html', {}, context_instance=RequestContext(request)) 

    if request.method == 'POST':
        return generate_invites_post(request)

    courses = Course.objects.filter(is_active=True)
    groups = Group.objects.filter(year=get_current_year())
    true_courses = []
    for course in courses:
        if user in course.teachers.all():
            true_courses.append(course)

    groups = set(groups.filter(course__in=true_courses))

    context = {
        'groups'    : groups,
        #'courses'   : courses,
    }
    
    return render_to_response('generate.html', context, context_instance=RequestContext(request))
Example #9
0
    def SendInviteFromUser(cls, user, to_user_email):
        if not cls.InsightsRemainingForUser(user):
            return False

        existing_user = UserController.GetUserByUserName(to_user_email)
        if existing_user:
            if existing_user.profile.registration_status in ['WAITING', 'DECLINED']:
                existing_user.delete()
            else:
                return True

        invite = Invite(user=user, code='', to_email=to_user_email )
        code = "".join( [random.choice(string.letters[:26]) for i in xrange(5)] ).upper()
        while Invite.objects.filter(code=code).count():
            code = "".join( [random.choice(string.letters[:26]) for i in xrange(5)] ).upper()
        invite.code = code
        invite.save()
        try:
            EmailController.SendInviteEmail(to_user_email, invite.code, user.username)
        except Exception, e:
            Logger.Warn('%s - InviteController.SendInviteFromUser - error sending email' % __name__)
            Logger.Debug('%s - InviteController.SendInviteFromUser - error sending email: %s' % (__name__, e))
            invite.delete()
            return False
Example #10
0
def profile(request, username=None, year=None):
    user = request.user

    user_to_show = user
    if username:
        user_to_show = get_object_or_404(User, username=username)

    user_to_show_profile = user_to_show.profile

    show_email = True
    user_above_user_to_show = True

    if user_to_show != user:
        user_teach_user_to_show = False
        user_to_show_teach_user = False
        user_school_user_to_show = False
        user_school_teach_user_to_show = False

        groups_user_to_show = user_to_show.group_set.all()
        groups = user.group_set.all()

        courses_user_to_show = Course.objects.filter(
            groups__in=groups_user_to_show)
        schools_user_to_show = School.objects.filter(
            courses__in=courses_user_to_show)
        courses_user_to_show_teacher = Course.objects.filter(
            teachers=user_to_show)
        schools_user_to_show_teacher = School.objects.filter(
            courses__in=courses_user_to_show_teacher)

        courses = Course.objects.filter(groups__in=groups)
        schools = School.objects.filter(courses__in=courses)
        courses_teacher = Course.objects.filter(teachers=user)
        schools_teacher = School.objects.filter(courses__in=courses_teacher)

        if courses_user_to_show_teacher & courses:
            user_to_show_teach_user = True

        if courses_teacher & courses_user_to_show:
            user_teach_user_to_show = True

        if (schools_user_to_show
                | schools_user_to_show_teacher) & (schools | schools_teacher):
            user_school_user_to_show = True

        if schools_teacher & schools_user_to_show:
            user_school_teach_user_to_show = True

        if not (user.is_staff or user_school_user_to_show):
            if not ((courses_user_to_show | courses_user_to_show_teacher) &
                    (courses | courses_teacher)):
                if not (groups_user_to_show & groups):
                    raise PermissionDenied

        show_email = \
            user.is_staff or \
            user_to_show_profile.show_email or \
            user_teach_user_to_show or \
            user_to_show_teach_user
        user_above_user_to_show = \
            user.is_staff or \
            user_school_teach_user_to_show

    teacher_in_courses = Course.objects.filter(is_active=True).filter(
        teachers=user_to_show).distinct()

    if year:
        current_year = get_object_or_404(Year, start_year=year)
    else:
        current_year = get_current_year()

    groups = user_to_show.group_set.all().distinct()

    courses = Course.objects.filter(is_active=True).filter(
        groups__in=groups).distinct()

    can_generate_invites = user_to_show == user and Invite.user_can_generate_invite(
        user)

    invite_form = InviteActivationForm()

    if request.method == 'POST':
        user_profile = user.profile
        if 'update-avatar' in request.POST:
            filename = 'avatar'
            if 'input-avatar' in request.FILES:
                image_content = request.FILES['input-avatar']
                user_profile.avatar.save(filename, image_content)
            elif request.POST['delete-avatar']:
                user_profile.avatar.delete()
            # elif request.POST['gravatar-link']:
            #     image_content = ContentFile(requests.get(request.POST['gravatar-link']).content)
            #     user_profile.avatar.save(filename, image_content)

            user_profile.save()
        else:
            invite_form = InviteActivationForm(request.POST)
            if invite_form.is_valid():
                invite = get_object_or_404(
                    Invite, key=invite_form.cleaned_data['invite'])
                if invite.group:
                    invite.group.students.add(user)
                    invite.invited_users.add(user)

    teacher_in_courses_archive = Course.objects.filter(is_active=False).filter(
        teachers=user_to_show).distinct()
    courses_archive = Course.objects.filter(is_active=False).filter(
        groups__in=groups).distinct()

    if len(teacher_in_courses or teacher_in_courses_archive) != 0 \
            and len(courses or courses_archive) != 0 \
            and len(groups) != 0:
        card_width = 'col-md-4'
    elif len(teacher_in_courses or teacher_in_courses_archive) != 0 \
            and len(courses or courses_archive) != 0 or len(teacher_in_courses or teacher_in_courses_archive) != 0 \
            and len(groups) != 0 or len(courses or courses_archive) != 0 \
            and len(groups) != 0:
        card_width = 'col-md-6'
    else:
        card_width = 'col-md-12'

    age = 0
    if user.is_staff and user_to_show_profile.birth_date:
        age = relativedelta(datetime.datetime.now(),
                            user_to_show_profile.birth_date).years
        age = age if age > 0 else 0

    context = {
        'user_to_show': user_to_show,
        'courses': group_by_year(courses),
        'courses_archive': group_by_year(courses_archive),
        'groups': group_by_year(groups),
        'teacher_in_courses': group_by_year(teacher_in_courses),
        'teacher_in_courses_archive':
        group_by_year(teacher_in_courses_archive),
        'current_year':
        unicode(current_year) if current_year is not None else '',
        'can_generate_invites': can_generate_invites,
        'invite_form': invite_form,
        'user_to_show_profile': user_to_show_profile,
        'card_width': card_width,
        'show_email': show_email,
        'user_above_user_to_show': user_above_user_to_show,
        'age': age,
    }

    return render(request, 'user_profile.html', context)
Example #11
0
def account(request):
    user = request.user
    membership_warning = True
    membership = {}

    if request.method == 'GET':
        forms = AccountSettingsForm()
        if user.apple_receipt:
            # try statement in case of apple_expires_date is None for some reason
            try:
                if user.apple_expires_date >= datetime.now():
                    membership = {
                        "type": "apple",
                        "apple_product_id": user.apple_product_id,
                        "expiration_date": user.apple_expires_date
                    }
                    membership_warning = None
            except TypeError:
                membership = {
                    "type": "apple",
                    "apple_product_id": "Apple In App Purchase",
                    "expiration_date": None
                }
                membership_warning = None

        if user.stripe_subscription_id and membership_warning:
            stripe_sub = user.check_stripe()

            if stripe_sub[0] == 'active':
                membership = {
                    "type": "stripe",
                    "expiration_date": stripe_sub[1]
                }
                membership_warning = None

        if user.paypal_subscription_id and membership_warning:
            paypal_sub = user.check_paypal()

            if paypal_sub[0] == "active" or (paypal_sub[0] == "cancelled" and
                                             paypal_sub[1] >= datetime.now()):
                membership = {
                    "type": "paypal",
                    "expiration_date": paypal_sub[1]
                }
                membership_warning = None

        if membership_warning:
            if Invite.has_invite(request.user):
                membership = {
                    "type": "invite",
                    "expiration_date": Invite.has_invite(request.user)
                }
                membership_warning = None
            else:
                message = "User " + request.user.username + ", email: " + request.user.email \
                          + " has got a corrupted membership. " \
                            "There is no valid subscription (active or cancelled) or invitation. "
                send_mail("Broken membership",
                          message,
                          env.str('ADMIN_EMAIL'), [env.str('ADMIN_EMAIL')],
                          fail_silently=False)
    else:
        form = AccountSettingsForm(request.POST, request.FILES)
        if 'delete' in request.POST:
            user.pic.delete()
            messages.success(request, 'You\'ve deleted profile picture.')
        elif form.is_valid() and form.cleaned_data['pic']:
            user.pic = form.cleaned_data['pic']
            user.save()
            messages.success(request, 'Boom! You\'ve got new profile picture.')
        else:
            messages.warning(request, 'You need to load picture to save it')
        return redirect('/account')

    return render(
        request, 'account/account.html', {
            'forms': forms,
            'membership': membership,
            "membership_warning": membership_warning
        })
Example #12
0
def profile(request, username=None, year=None):
    user = request.user

    user_to_show = user
    if username:
        user_to_show = get_object_or_404(User, username=username)

    user_to_show_profile = user_to_show.get_profile()

    show_email = True
    user_above_user_to_show = True

    if user_to_show != user:
        user_teach_user_to_show = False
        user_to_show_teach_user = False
        user_school_user_to_show = False
        user_school_teach_user_to_show = False

        groups_user_to_show = user_to_show.group_set.all()
        groups = user.group_set.all()

        courses_user_to_show = Course.objects.filter(groups__in=groups_user_to_show)
        schools_user_to_show = School.objects.filter(courses__in=courses_user_to_show)
        courses_user_to_show_teacher = Course.objects.filter(teachers=user_to_show)
        schools_user_to_show_teacher = School.objects.filter(courses__in=courses_user_to_show_teacher)

        courses = Course.objects.filter(groups__in=groups)
        schools = School.objects.filter(courses__in=courses)
        courses_teacher = Course.objects.filter(teachers=user)
        schools_teacher = School.objects.filter(courses__in=courses_teacher)

        if courses_user_to_show_teacher & courses:
            user_to_show_teach_user = True

        if courses_teacher & courses_user_to_show:
            user_teach_user_to_show = True

        if (schools_user_to_show | schools_user_to_show_teacher) & (schools | schools_teacher):
            user_school_user_to_show = True

        if schools_teacher & schools_user_to_show:
            user_school_teach_user_to_show = True

        if not (user.is_staff or user_school_user_to_show):
            if not ((courses_user_to_show | courses_user_to_show_teacher) & (courses | courses_teacher)):
                if not (groups_user_to_show & groups):
                    raise PermissionDenied

        show_email = \
            user.is_staff or \
            user_to_show_profile.show_email or \
            user_teach_user_to_show or \
            user_to_show_teach_user
        user_above_user_to_show = \
            user.is_staff or \
            user_school_teach_user_to_show

    teacher_in_courses = Course.objects.filter(is_active=True).filter(teachers=user_to_show).distinct()

    if year:
        current_year = get_object_or_404(Year, start_year=year)
    else:
        current_year = get_current_year()

    groups = user_to_show.group_set.all().distinct()

    courses = Course.objects.filter(is_active=True).filter(groups__in=groups).distinct()

    can_generate_invites = user_to_show == user and Invite.user_can_generate_invite(user)

    invite_form = InviteActivationForm()

    if request.method == 'POST':
        user_profile = user.get_profile()
        if 'update-avatar' in request.POST:
            filename = 'avatar'
            if 'input-avatar' in request.FILES:
                image_content = request.FILES['input-avatar']
                user_profile.avatar.save(filename, image_content)
            elif request.POST['delete-avatar']:
                user_profile.avatar.delete()
            # elif request.POST['gravatar-link']:
            #     image_content = ContentFile(requests.get(request.POST['gravatar-link']).content)
            #     user_profile.avatar.save(filename, image_content)

            user_profile.save()
        else:
            invite_form = InviteActivationForm(request.POST)
            if invite_form.is_valid():
                invite = get_object_or_404(Invite, key=invite_form.cleaned_data['invite'])
                if invite.group:
                    invite.group.students.add(user)
                    invite.invited_users.add(user)

    teacher_in_courses_archive = Course.objects.filter(is_active=False).filter(teachers=user_to_show).distinct()
    courses_archive = Course.objects.filter(is_active=False).filter(groups__in=groups).distinct()

    if len(teacher_in_courses or teacher_in_courses_archive) != 0 \
            and len(courses or courses_archive) != 0 \
            and len(groups) != 0:
        card_width = 'col-md-4'
    elif len(teacher_in_courses or teacher_in_courses_archive) != 0 \
            and len(courses or courses_archive) != 0 or len(teacher_in_courses or teacher_in_courses_archive) != 0 \
            and len(groups) != 0 or len(courses or courses_archive) != 0 \
            and len(groups) != 0:
        card_width = 'col-md-6'
    else:
        card_width = 'col-md-12'

    age = 0
    if user.is_staff and user_to_show_profile.birth_date:
        age = relativedelta(datetime.datetime.now(), user_to_show_profile.birth_date).years
        age = age if age > 0 else 0

    context = {
        'user_to_show': user_to_show,
        'courses': group_by_year(courses),
        'courses_archive': group_by_year(courses_archive),
        'groups': group_by_year(groups),
        'teacher_in_courses': group_by_year(teacher_in_courses),
        'teacher_in_courses_archive': group_by_year(teacher_in_courses_archive),
        'current_year': unicode(current_year) if current_year is not None else '',
        'can_generate_invites': can_generate_invites,
        'invite_form': invite_form,
        'user_to_show_profile': user_to_show_profile,
        'card_width': card_width,
        'show_email': show_email,
        'user_above_user_to_show': user_above_user_to_show,
        'age': age,
    }

    return render_to_response('user_profile.html', context, context_instance=RequestContext(request))