Esempio n. 1
0
def edit_page(request, slug=None):
    '''
    Edits a blog entry or a web page (creates one if needed)
    '''
    if is_authorized_user():
        page = None
        if request.method == 'GET':
            if slug:
                try:
                    page = memcache.get('/edit/%s/' %
                                        slug)  # @UndefinedVariable
                    if not page:
                        key = ndb.Key(urlsafe=slug)
                        page = key.get()

                    p = page.to_dict()

                    p['tags'] = ",".join(p['tags'])
                    p['key'] = page.key.id()
                    if p.get('published_at'):
                        p.pop('published_at')

                    form = PageForm(data=p)
                except:
                    tb = traceback.format_exc()
                    print tb
                    raise Http404
            else:
                form = PageForm(initial={'timestamp': int(time.time() * 1000)})
                form.fields['blog'].initial = True if request.GET.get(
                    'type', False) else False

        else:  # POST
            form = PageForm(data=request.POST, files=request.FILES)
            if form.data['save'] == 'delete':
                return delete_item(request, form)
            # else

            if form.is_valid():
                d = form.cleaned_data

                if d['key']:
                    # updating an existing entry
                    key = ndb.Key('Page', d['key'])
                    page = key.get()
                    mem_key = page.get_request_path(d.get('blog'))
                    memcache.delete(mem_key)  # @UndefinedVariable
                    memcache.delete(mem_key + "full")  # @UndefinedVariable
                    memcache.delete(mem_key + "mobile")  # @UndefinedVariable
                else:
                    page = Page()

                if d.get('link'):
                    page.link = d['link']
                else:
                    page.link = create_link(d['title'])

                page.content = d['content']
                page.title = d['title']
                page.draft = d.get('draft', False)
                page.blog = d.get('blog', False)
                page.image = d['image']
                page.timestamp = int(d['timestamp'])
                page.template = d.get('template') or 'blog-post.html'
                page.summary = d['summary'] or re.sub(
                    '\s{2,}', ' ', strip_tags(d['content']))[0:300]

                page.published_at = datetime.datetime.utcfromtimestamp(
                    int(d['timestamp']) / 1000)
                page.priority = d.get('priority', 1)

                tags = []
                for tag in d['tags'].split(','):
                    tags.append(tag.strip())
                    update_tag(tag.strip())

                page.tags = tags
                page.put()

                if page.draft == False and page.blog == True:
                    memcache.set('/', None)  # @UndefinedVariable
                    update_archive(page)

                if request.POST.get('save') == 'save and continue':
                    # we need to deal with the eventual consistency problem. So the
                    # page will be first pushed to the cache if we dont' do that we will see
                    # incorrect or missing data

                    memcache.set('/edit/%s/' % page.link,
                                 page)  # @UndefinedVariable

                    return HttpResponseRedirect('/edit/%s/' % page.link)
                else:
                    if page.blog:
                        return HttpResponseRedirect('/list/?type=blog')
                    else:
                        return HttpResponseRedirect('/list/')
            else:
                print form.errors
        return render(request, 'admin/edit-page.html', {
            'form': form,
            'page': page
        })
    else:
        return HttpResponse("<a href='{}'>login</a>".format(
            users.create_login_url('/list/')))