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()}
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')
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')
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)
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)
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()
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()
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()
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()
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() }
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
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
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]))
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]))
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)
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}
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}
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)
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})
def get(self, request, **kwargs): deck = get_deck_or_404(request.user, kwargs.get('pk')) return self.render_to_response({'suspended': deck.suspended})
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
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})
def get(self, request, **kwargs): deck = get_deck_or_404(request.user, kwargs.get('pk')) return self.render_to_response({'suspended': deck.suspended})
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