Пример #1
0
def rest_deck_subscribe(request, deck_id):
    if request.method == 'POST':
        deck = get_deck_or_404(request.user, deck_id)
        new_deck = deck.subscribe(request.user)

        return {'deckId': new_deck.id,
                'postRedirect': new_deck.get_absolute_url()}
Пример #2
0
def deck_textbook_source(request, deck_id=None):
    '''
    Expects 2 forms, at least one filled.
    Reusing a textbook takes precedence over creating a new one.
    '''
    deck = get_deck_or_404(request.user, deck_id, must_own=True)

    old_form = TextbookSourceForm(request.POST, instance=deck)
    new_form = TextbookForm(request.POST)

    success = True
    will_create_new_book = True

    if old_form.is_valid():
        deck = old_form.save()
        will_create_new_book = deck.textbook_source is None
    else:
        success = False
    if new_form.is_valid() and will_create_new_book:
        textbook = new_form.save()
        deck.textbook_source = textbook
        deck.save()
    elif not new_form.is_valid():
        success = False

    return HttpResponse(json_encode({'success': success}),
                        mimetype='text/javascript')
Пример #3
0
def deck_textbook_source(request, deck_id=None):
    '''
    Expects 2 forms, at least one filled.
    Reusing a textbook takes precedence over creating a new one.
    '''
    deck = get_deck_or_404(request.user, deck_id, must_own=True)

    old_form = TextbookSourceForm(request.POST, instance=deck)
    new_form = TextbookForm(request.POST)

    success = True
    will_create_new_book = True

    if old_form.is_valid():
        deck = old_form.save()
        will_create_new_book = deck.textbook_source is None
    else:
        success = False
    if new_form.is_valid() and will_create_new_book:
        textbook = new_form.save()
        deck.textbook_source = textbook
        deck.save()
    elif not new_form.is_valid():
        success = False

    return HttpResponse(json_encode({'success': success}), mimetype='text/javascript')
Пример #4
0
def deck_detail(request, deck_id=None):
    deck = get_deck_or_404(request.user, deck_id)

    if request.user.is_authenticated:
        # Redirect if the user is already subscribed to this deck.
        subscriber = deck.get_subscriber_deck_for_user(request.user)
        if subscriber:
            return redirect(subscriber.get_absolute_url())

    fact_tags = deck.fact_tags()

    detail_args = {
        'queryset': Deck.objects.filter(active=True),
        'template_object_name': 'deck',
        'extra_context': {
            'field_types': FactType.objects.get(id=1).fieldtype_set.all().order_by('ordinal'),
            'fact_tags': fact_tags,

            'textbook_source_form': TextbookSourceForm(),
            'textbook_form': TextbookForm(),
        },
        'object_id': deck_id,

    }
    #detail_args['extra_context'].update(study_options_context(request, deck_id=deck_id))
    return DetailView.as_view(request, **detail_args)
Пример #5
0
def deck_detail(request, deck_id=None):
    deck = get_deck_or_404(request.user, deck_id)

    if request.user.is_authenticated():
        # Redirect if the user is already subscribed to this deck.
        subscriber = deck.get_subscriber_deck_for_user(request.user)
        if subscriber:
            return redirect(subscriber.get_absolute_url())

    fact_tags = deck.fact_tags()

    detail_args = {
        'queryset': Deck.objects.filter(active=True),
        'template_object_name': 'deck',
        'extra_context': {
            'field_types':
            FactType.objects.get(id=1).fieldtype_set.all().order_by('ordinal'),
            'fact_tags':
            fact_tags,
            'textbook_source_form':
            TextbookSourceForm(),
            'textbook_form':
            TextbookForm(),
        },
        'object_id': deck_id,
    }
    #detail_args['extra_context'].update(study_options_context(request, deck_id=deck_id))
    return DetailView.as_view(request, **detail_args)
Пример #6
0
def rest_deck_name(request, deck_id):
    deck = get_deck_or_404(request.user, deck_id)

    if request.method == 'GET':
        return deck.name
    elif request.method == 'POST':
        deck.name = request.POST['name']
        deck.save()
Пример #7
0
def rest_deck_description(request, deck_id):
    deck = get_deck_or_404(request.user, deck_id)

    if request.method == 'GET':
        return deck.description
    elif request.method == 'POST':
        deck.description = request.POST['description']
        deck.save()
Пример #8
0
def rest_deck_description(request, deck_id):
    deck = get_deck_or_404(request.user, deck_id)

    if request.method == 'GET':
        return deck.description
    elif request.method == 'POST':
        deck.description = request.POST['description']
        deck.save()
Пример #9
0
def rest_deck_name(request, deck_id):
    deck = get_deck_or_404(request.user, deck_id)

    if request.method == 'GET':
        return deck.name
    elif request.method == 'POST':
        deck.name = request.POST['name']
        deck.save()
Пример #10
0
def rest_deck_subscribe(request, deck_id):
    if request.method == 'POST':
        deck = get_deck_or_404(request.user, deck_id)
        new_deck = deck.subscribe(request.user)

        return {
            'deckId': new_deck.id,
            'postRedirect': new_deck.get_absolute_url()
        }
Пример #11
0
    def get_object(self):
        deck = get_deck_or_404(self.request.user, self.kwargs.get('pk'))

        # If the user is already subscribed to this deck,
        # redirect to their subscribed copy.
        subscriber = deck.get_subscriber_deck_for_user(self.request.user)
        if subscriber:
            raise HttpTemporaryRedirectException(
                    reverse('rest-deck', args=[subscriber.id]))

        return deck
Пример #12
0
    def get_object(self):
        deck = get_deck_or_404(self.request.user, self.kwargs.get('pk'))

        # If the user is already subscribed to this deck,
        # redirect to their subscribed copy.
        subscriber = deck.get_subscriber_deck_for_user(self.request.user)
        if subscriber:
            raise HttpTemporaryRedirectException(
                reverse('rest-deck', args=[subscriber.id]))

        return deck
Пример #13
0
    def post(self, request, **kwargs):
        user = self.request.user
        deck = get_deck_or_404(user, self.kwargs.get('pk'))

        # Is it already this user's deck?
        if deck.owner == user:
            return self.responses.see_other(
                reverse('rest-deck', args=[deck.id]))

        # Check if the user is aready subscribed to this deck.
        subscriber_deck = deck.get_subscriber_deck_for_user(user)
        if subscriber_deck:
            return self.responses.see_other(
                reverse('rest-deck', args=[subscriber_deck.id]))

        # Create the new subscriber deck and give its URL.
        new_deck = deck.subscribe(user)
        return self.responses.created(reverse('rest-deck', args=[new_deck.id]))
Пример #14
0
    def post(self, request, **kwargs):
        user = self.request.user
        deck = get_deck_or_404(user, self.kwargs.get('pk'))

        # Is it already this user's deck?
        if deck.owner == user:
            return self.responses.see_other(
                    reverse('rest-deck', args=[deck.id]))
        
        # Check if the user is aready subscribed to this deck.
        subscriber_deck = deck.get_subscriber_deck_for_user(user)
        if subscriber_deck:
            return self.responses.see_other(
                    reverse('rest-deck', args=[subscriber_deck.id]))
                    

        # Create the new subscriber deck and give its URL.
        new_deck = deck.subscribe(user)
        return self.responses.created(
                reverse('rest-deck', args=[new_deck.id]))
Пример #15
0
    def wrapper(request, *args, **kwargs):
        # Deck
        kwargs['deck'] = None
        deck_pk = request.GET.get('deck', '').strip()
        if deck_pk:
            deck = get_deck_or_404(request.user, deck_pk)
            kwargs['deck'] = deck

        # Tags
        try:
            #TODO-OLD support for multiple tags
            tag_id = int(request.GET.get('tags', request.GET.get('tag', -1)))
        except ValueError:
            tag_id = -1
        if tag_id != -1:
            tag_ids = [tag_id]  #TODO-OLD support multiple tags
            tags = usertagging.models.Tag.objects.filter(id__in=tag_ids)
        else:
            tags = None
        kwargs['tags'] = tags

        return func(request, *args, **kwargs)
Пример #16
0
def rest_deck(request, deck_id):
    deck = get_deck_or_404(request.user, deck_id)

    if request.method == 'DELETE':
        if deck.subscriber_decks.filter(active=True).exists():
            deck.active = False
            deck.save()
        else:
            deck.delete_cascading()
    elif request.method == 'PUT':
        params = clean_query(request.POST, {'shared': bool})
        # change shared status
        if params.get('shared') is not None:
            if params['shared']:
                if deck.synchronized_with:
                    raise ApiException
                deck.share()
            else:
                if not deck.shared:
                    raise ApiException
                deck.unshare()
        return {'shared': deck.shared}
Пример #17
0
def rest_deck(request, deck_id):
    deck = get_deck_or_404(request.user, deck_id)

    if request.method == 'DELETE':
        if deck.subscriber_decks.filter(active=True).exists():
            deck.active = False
            deck.save()
        else:
            deck.delete_cascading()
    elif request.method == 'PUT':
        params = clean_query(request.POST, {'shared': bool})
        # change shared status
        if params.get('shared') is not None:
            if params['shared']:
                if deck.synchronized_with:
                    raise ApiException
                deck.share()
            else:
                if not deck.shared:
                    raise ApiException
                deck.unshare()
        return {'shared': deck.shared}
Пример #18
0
    def wrapper(request, *args, **kwargs):
        # Deck
        kwargs['deck'] = None
        deck_pk = request.GET.get('deck', '').strip()
        if deck_pk:
            deck = get_deck_or_404(request.user, deck_pk)
            kwargs['deck'] = deck

        # Tags
        try:
            #TODO-OLD support for multiple tags
            tag_id = int(request.GET.get('tags',
                request.GET.get('tag', -1)))
        except ValueError:
            tag_id = -1
        if tag_id != -1:
            tag_ids = [tag_id] #TODO-OLD support multiple tags
            tags = usertagging.models.Tag.objects.filter(id__in=tag_ids)
        else:
            tags = None
        kwargs['tags'] = tags

        return func(request, *args, **kwargs)
Пример #19
0
 def post(self, request, **kwargs):
     deck = get_deck_or_404(request.user, kwargs.get('pk'), must_own=True)
     params = clean_query(request.POST, {'suspended': bool})
     deck.suspended = params.get('suspended', deck.suspended)
     deck.save()
     return self.render_to_response({'suspended': deck.suspended})
Пример #20
0
 def get(self, request, **kwargs):
     deck = get_deck_or_404(request.user, kwargs.get('pk'))
     return self.render_to_response({'suspended': deck.suspended})
Пример #21
0
def rest_facts(request, deck=None, tags=None):
    #TODO-OLD refactor into facts (no???)
    if request.method == 'GET':
        ret = []
        if request.GET['fact_type']:
            fact_type_id = request.GET['fact_type']
            fact_type = get_object_or_404(FactType, pk=fact_type_id)

            user = deck.owner if deck else request.user

            facts = Fact.objects.with_upstream(
                user, deck=deck, tags=tags).filter(active=True)

            #is the user searching his facts?
            if ('search' in request.GET
                    and request.GET['search'].strip()):
                search_query = request.GET['search']
                facts = Fact.objects.search(
                    fact_type, search_query, query_set=facts)
                #FIXME add search for synchronized facts too!

            for fact in facts.iterator():
                row = {
                    'fact-id': fact.id,
                    'suspended': fact.suspended(),
                }

                ident, name = '', ''
                for field_content in fact.field_contents:
                    #TODO-OLD rename to be clearer, like field_id, or ???
                    key = 'id{0}'.format(field_content.field_type_id)

                    if not ident:
                        ident = key
                    elif not name:
                        name = key

                    row[key] = field_content.human_readable_content()
                    row['{0}_field-content-id'.format(key)] = field_content.id

                if not name:
                    name = ident

                ret.append(row)
            ret = to_dojo_data(ret)
            ret['identifier'] = 'fact-id'
            #ret['name'] = name #todo:for <2 cols/fields...?
            return ret
    elif request.method == 'POST':
        # Create fact in deck, including its fields and cards. POST method.
        #TODO-OLD refactor into other module probably
        ret = {}

        #TODO-OLD just get this from the form object.
        deck = get_deck_or_404(request.user, request.POST['fact-deck'],
                               must_own=True)

        # Override the submitted deck ID with the ID from the URL,
        # since this is a RESTful interface.
        post_data = request.POST.copy()
        #post_data['fact-deck'] = deck_id

        #todo: refactor this into model code

        #CardFormset = modelformset_factory(Card, exclude=('fact', 'ease_factor', )) #TODO-OLD make from CardForm
        #card_formset = CardFormset(post_data, prefix='card')
        card_templates = CardTemplate.objects.filter(
                id__in=[e[1] for e in post_data.items()
                if e[0].find('card_template') == 0])

        #FieldContentFormset = modelformset_factory(FieldContent, exclude=('fact', ))
        FieldContentFormset = modelformset_factory(
            FieldContent, form=FieldContentForm)
        field_content_formset = FieldContentFormset(
            post_data, prefix='field_content')

        fact_form = FactForm(post_data, prefix='fact')

        if field_content_formset.is_valid() and fact_form.is_valid():
            #TODO-OLD automate the tag saving in forms.py
            new_fact = fact_form.save()
            new_fact.active = True
            new_fact.save()

            # maps subfact group numbers to the subfact object
            group_to_subfact = {}
            for field_content_form in field_content_formset.forms:
                #TODO-OLD don't create fieldcontent objects for
                # optional fields which were left blank.
                new_field_content = field_content_form.save(commit=False)
                # is this a field of the parent fact, or a subfact?
                if (new_field_content.field_type.fact_type
                    == new_fact.fact_type):
                    # parent fact
                    new_field_content.fact = new_fact
                else:
                    # subfact
                    group = field_content_form\
                            .cleaned_data['subfact_group']
                    if group not in group_to_subfact.keys():
                        # create the new subfact
                        new_subfact = Fact(
                                fact_type=new_field_content\
                                          .field_type.fact_type,
                                active=True,
                                #deck=new_fact.deck,
                                parent_fact=new_fact,
                        )
                        new_subfact.save()
                        group_to_subfact[group] = new_subfact
                    new_field_content.fact = group_to_subfact[group]
                new_field_content.save()

            for card_template in card_templates:
                #card_form in card_formset.forms:
                new_card = Card(
                    template=card_template,
                    fact=new_fact,
                    active=True,
                    priority = 0)
                new_card.randomize_new_order()
                new_card.save()
        else:
            raise ApiException({
                #'card': card_formset.errors,
                'field_content': field_content_formset.errors,
                'fact': [fact_form.errors]
            })
        return ret
Пример #22
0
 def post(self, request, **kwargs):
     deck = get_deck_or_404(request.user, kwargs.get('pk'), must_own=True)
     params = clean_query(request.POST, {'suspended': bool})
     deck.suspended = params.get('suspended', deck.suspended)
     deck.save()
     return self.render_to_response({'suspended': deck.suspended})
Пример #23
0
 def get(self, request, **kwargs):
     deck = get_deck_or_404(request.user, kwargs.get('pk'))
     return self.render_to_response({'suspended': deck.suspended})
Пример #24
0
def rest_facts(request, deck=None, tags=None):
    #TODO-OLD refactor into facts (no???)
    if request.method == 'GET':
        ret = []
        if request.GET['fact_type']:
            fact_type_id = request.GET['fact_type']
            fact_type = get_object_or_404(FactType, pk=fact_type_id)

            user = deck.owner if deck else request.user

            facts = Fact.objects.with_upstream(user, deck=deck,
                                               tags=tags).filter(active=True)

            #is the user searching his facts?
            if ('search' in request.GET and request.GET['search'].strip()):
                search_query = request.GET['search']
                facts = Fact.objects.search(fact_type,
                                            search_query,
                                            query_set=facts)
                #FIXME add search for synchronized facts too!

            for fact in facts.iterator():
                row = {
                    'fact-id': fact.id,
                    'suspended': fact.suspended(),
                }

                ident, name = '', ''
                for field_content in fact.field_contents:
                    #TODO-OLD rename to be clearer, like field_id, or ???
                    key = 'id{0}'.format(field_content.field_type_id)

                    if not ident:
                        ident = key
                    elif not name:
                        name = key

                    row[key] = field_content.human_readable_content()
                    row['{0}_field-content-id'.format(key)] = field_content.id

                if not name:
                    name = ident

                ret.append(row)
            ret = to_dojo_data(ret)
            ret['identifier'] = 'fact-id'
            #ret['name'] = name #todo:for <2 cols/fields...?
            return ret
    elif request.method == 'POST':
        # Create fact in deck, including its fields and cards. POST method.
        #TODO-OLD refactor into other module probably
        ret = {}

        #TODO-OLD just get this from the form object.
        deck = get_deck_or_404(request.user,
                               request.POST['fact-deck'],
                               must_own=True)

        # Override the submitted deck ID with the ID from the URL,
        # since this is a RESTful interface.
        post_data = request.POST.copy()
        #post_data['fact-deck'] = deck_id

        #todo: refactor this into model code

        #CardFormset = modelformset_factory(Card, exclude=('fact', 'ease_factor', )) #TODO-OLD make from CardForm
        #card_formset = CardFormset(post_data, prefix='card')
        card_templates = CardTemplate.objects.filter(id__in=[
            e[1] for e in post_data.items() if e[0].find('card_template') == 0
        ])

        #FieldContentFormset = modelformset_factory(FieldContent, exclude=('fact', ))
        FieldContentFormset = modelformset_factory(FieldContent,
                                                   form=FieldContentForm)
        field_content_formset = FieldContentFormset(post_data,
                                                    prefix='field_content')

        fact_form = FactForm(post_data, prefix='fact')

        if field_content_formset.is_valid() and fact_form.is_valid():
            #TODO-OLD automate the tag saving in forms.py
            new_fact = fact_form.save()
            new_fact.active = True
            new_fact.save()

            # maps subfact group numbers to the subfact object
            group_to_subfact = {}
            for field_content_form in field_content_formset.forms:
                #TODO-OLD don't create fieldcontent objects for
                # optional fields which were left blank.
                new_field_content = field_content_form.save(commit=False)
                # is this a field of the parent fact, or a subfact?
                if (new_field_content.field_type.fact_type ==
                        new_fact.fact_type):
                    # parent fact
                    new_field_content.fact = new_fact
                else:
                    # subfact
                    group = field_content_form\
                            .cleaned_data['subfact_group']
                    if group not in group_to_subfact.keys():
                        # create the new subfact
                        new_subfact = Fact(
                                fact_type=new_field_content\
                                          .field_type.fact_type,
                                active=True,
                                #deck=new_fact.deck,
                                parent_fact=new_fact,
                        )
                        new_subfact.save()
                        group_to_subfact[group] = new_subfact
                    new_field_content.fact = group_to_subfact[group]
                new_field_content.save()

            for card_template in card_templates:
                #card_form in card_formset.forms:
                new_card = Card(template=card_template,
                                fact=new_fact,
                                active=True,
                                priority=0)
                new_card.randomize_new_order()
                new_card.save()
        else:
            raise ApiException({
                #'card': card_formset.errors,
                'field_content': field_content_formset.errors,
                'fact': [fact_form.errors]
            })
        return ret