Ejemplo n.º 1
0
def upload(request):
    if request.user.username != UPLOAD_USER:
        return render_to_response('address/error',
                                  {'message': '你需要使用 %s 来登录!' % UPLOAD_USER})
    file_obj = request.FILES.get('file', None)
    if file_obj:
        import csv
        import StringIO
        buf = StringIO.StringIO(file_obj['content'])
        try:
            reader = csv.reader(buf)
        except:
            return render_to_response('address/error',
                                      {'message': '你需要上传一个csv格式的文件!'})
        for row in reader:
            objs = addresses.get_list(name__exact=row[0])
            if not objs:
                obj = addresses.Address(name=row[0],
                                        gender=row[1],
                                        telphone=row[2],
                                        mobile=row[3],
                                        room=row[4])
            else:
                obj = objs[0]
                obj.gender = row[1]
                obj.telphone = row[2]
                obj.mobile = row[3]
                obj.room = row[4]
            obj.save()

        return HttpResponseRedirect('/address/')
    else:
        return render_to_response('address/error', {'message': '你需要上传一个文件!'})
Ejemplo n.º 2
0
def upload(request):
    if request.user.username != UPLOAD_USER:
        return render_to_response('address/error', {'message':'你需要使用 %s 来登录!' % UPLOAD_USER})
    file_obj = request.FILES.get('file', None)
    if file_obj:
        import csv
        import StringIO
        buf = StringIO.StringIO(file_obj['content'])
        try:
            reader = csv.reader(buf)
        except:
            return render_to_response('address/error', {'message':'你需要上传一个csv格式的文件!'})
        for row in reader:
            objs = addresses.get_list(name__exact=row[0])
            if not objs:
                obj = addresses.Address(name=row[0], gender=row[1], telphone=row[2], mobile=row[3], room=row[4])
            else:
                obj = objs[0]
                obj.gender = row[1]
                obj.telphone = row[2]
                obj.mobile = row[3]
                obj.room = row[4]
            obj.save()
            
        return HttpResponseRedirect('/address/')
    else:
        return render_to_response('address/error', {'message':'你需要上传一个文件!'})
Ejemplo n.º 3
0
def login(request):
    username = request.POST.get("username", None)
    if username:
        request.session["username"] = username
    username = request.session.get("username", None)
    if username:
        return render_to_response("login", {"username": username})
    else:
        return render_to_response("login")
Ejemplo n.º 4
0
def template_filter_index(request):
    if not doc:
        return missing_docutils_page(request)

    saved_tagset = template.registered_tags.copy(), template.registered_filters.copy()
    load_all_installed_template_libraries()

    filters = []
    for filtername in template.registered_filters:
        title, body, metadata = doc.parse_docstring(template.registered_filters[filtername][0].__doc__)
        if title:
            title = doc.parse_rst(title, 'filter', 'filter:' + filtername)
        if body:
            body = doc.parse_rst(body, 'filter', 'filter:' + filtername)
        for key in metadata:
            metadata[key] = doc.parse_rst(metadata[key], 'filter', 'filter:' + filtername)
        metadata['AcceptsArgument'] = template.registered_filters[filtername][1]
        library = template.registered_filters[filtername][0].__module__.split('.')[-1]
        if library == 'template_loader' or library == 'defaultfilters':
            library = None
        filters.append({
            'name'    : filtername,
            'title'   : title,
            'body'    : body,
            'meta'    : metadata,
            'library' : library,
        })

    template.registered_tags, template.registered_filters = saved_tagset

    return render_to_response('admin_doc/template_filter_index', {'filters': filters}, context_instance=DjangoContext(request))
Ejemplo n.º 5
0
def edit(request, pagename):
    """显示编辑存在页面"""
    page = wikis.get_object(pagename__exact=pagename)
    return render_to_response('wiki/edit', {
        'pagename': pagename,
        'content': page.content
    })
Ejemplo n.º 6
0
def index(request):
    import datetime
    feed_list = feeds.get_list(feed_type__exact='planet', order_by=['title'])
    post_list = posts.get_list(feed__feed_type__exact='planet', order_by=['-modified'], limit=40)
    post_short_list = posts.get_list(feed__feed_type__exact='planet', modified__gt = (datetime.datetime.now() - datetime.timedelta(hours=24)), order_by=['-modified'], offset=41, limit=100)
    delicious_list = posts.get_list(feed__feed_type__exact='delicious', order_by=['-modified'], limit=20)
    return render_to_response('planetex/index', {'feeds':feed_list, 'posts':post_list, 'posts_short':post_short_list, 'delicious':delicious_list})
Ejemplo n.º 7
0
 def g(request, *args, **kwargs):
     result = function(request, *args, **kwargs)
     if isinstance(result, dict):
         ctx = extensions.DjangoContext(request)
         return extensions.render_to_response(template_name, result, ctx)
     else:
         return result
Ejemplo n.º 8
0
def logout(request, next_page=None):
    "Logs out the user and displays 'You are logged out' message."
    try:
        del request.session[users.SESSION_KEY]
    except KeyError:
        return render_to_response('registration/logged_out', context_instance=DjangoContext(request))
    else:
        # Redirect to this page until the session has been cleared.
        return HttpResponseRedirect(next_page or request.path)
Ejemplo n.º 9
0
def password_change(request):
    new_data, errors = {}, {}
    form = PasswordChangeForm(request.user)
    if request.POST:
        new_data = request.POST.copy()
        errors = form.get_validation_errors(new_data)
        if not errors:
            form.save(new_data)
            return HttpResponseRedirect('%sdone/' % request.path)
    return render_to_response('registration/password_change_form', {'form': formfields.FormWrapper(form, new_data, errors)},
        context_instance=DjangoContext(request))
Ejemplo n.º 10
0
def torrent(request, t_id):
    torrent = get_object_or_404(torrents, pk=t_id)
    try:
        fetcher = fetchers.get_object(pk=torrent.id)
    except fetchers.FetcherDoesNotExist:
        fetcher = None
    msgs = messages.get_list(order_by=['-logged'], limit=30, torrent__id__exact=torrent.id)
    return render_to_response('aurora/torrent', {
            'torrent': torrent,
            'fetcher': fetcher,
            'aurora_messages': msgs,
        })
Ejemplo n.º 11
0
def subscribe(request):
    if request.GET:
        url = request.GET['url']
        fds = feedfinder.getFeeds(url)
        return render_to_response('aggemam/subscribe', {'url': url,
                                            'feeds': fds})

    elif request.POST:
        subs = []
        for url in request.POST.getlist('feeds'):
            try:
                feed = feeds.get_object(url__exact=url)
            except feeds.FeedDoesNotExist:
                feed = feeds.Feed(url=url, update=True)
                feed.save()

            sub = subscriptions.Subscription(user=request.user, feed=feed)
            sub.save()
            subs.append(sub)

        return render_to_response('aggemam/subscribed', {'subscriptions': subs})
Ejemplo n.º 12
0
def password_reset(request, is_admin_site=False):
    new_data, errors = {}, {}
    form = PasswordResetForm()
    if request.POST:
        new_data = request.POST.copy()
        errors = form.get_validation_errors(new_data)
        if not errors:
            if is_admin_site:
                form.save(request.META['HTTP_HOST'])
            else:
                form.save()
            return HttpResponseRedirect('%sdone/' % request.path)
    return render_to_response('registration/password_reset_form', {'form': formfields.FormWrapper(form, new_data, errors)},
        context_instance=DjangoContext(request))
Ejemplo n.º 13
0
def model_index(request):
    if not doc:
        return missing_docutils_page(request)

    models = []
    for app in meta.get_installed_model_modules():
        for model in app._MODELS:
            opts = model._meta
            models.append({
                'name'   : '%s.%s' % (opts.app_label, opts.module_name),
                'module' : opts.app_label,
                'class'  : opts.module_name,
            })
    return render_to_response('admin_doc/model_index', {'models': models}, context_instance=DjangoContext(request))
Ejemplo n.º 14
0
def index(request, pagename=""):
    """显示正常页面,对页面的文字做特殊的链接处理"""
    if pagename:
        #查找是否已经存在页面
        pages = wikis.get_list(pagename__exact=pagename)
        if pages:
            #存在则调用页面模板进行显示
            return process('wiki/page', pages[0])
        else:
            #不存在则进入编辑画面
            return render_to_response('wiki/edit', {'pagename': pagename})

    else:
        page = wikis.get_object(pagename__exact='FrontPage')
        return process('wiki/page', page)
Ejemplo n.º 15
0
def index(request, pagename=""):
    """显示正常页面,对页面的文字做特殊的链接处理"""
    if pagename:
        #查找是否已经存在页面
        pages = wikis.get_list(pagename__exact=pagename)
        if pages:
            #存在则调用页面模板进行显示
            return process('wiki/page', pages[0])
        else:
            #不存在则进入编辑画面
            return render_to_response('wiki/edit', {'pagename':pagename})
        
    else:
        page = wikis.get_object(pagename__exact='FrontPage')
        return process('wiki/page', page)
Ejemplo n.º 16
0
def _display_login_form(request, error_message=''):
    request.session.set_test_cookie()
    if request.POST and request.POST.has_key('post_data'):
        # User has failed login BUT has previously saved post data.
        post_data = request.POST['post_data']
    elif request.POST:
        # User's session must have expired; save their post data.
        post_data = _encode_post_data(request.POST)
    else:
        post_data = _encode_post_data({})
    return render_to_response('admin/login', {
        'title': 'Log in',
        'app_path': request.path,
        'post_data': post_data,
        'error_message': error_message
    }, context_instance=DjangoContext(request))
Ejemplo n.º 17
0
def flag(request, comment_id):
    """
    Flags a comment. Confirmation on GET, action on POST.

    Templates: `comments/flag_verify`, `comments/flag_done`
    Context:
        comment
            the flagged `comments.comments` object
    """
    try:
        comment = comments.get_object(pk=comment_id, site__id__exact=SITE_ID)
    except comments.CommentDoesNotExist:
        raise Http404
    if request.POST:
        userflags.flag(comment, request.user)
        return HttpResponseRedirect('%sdone/' % request.path)
    return render_to_response('comments/flag_verify', {'comment': comment}, context_instance=DjangoContext(request))
Ejemplo n.º 18
0
def template_detail(request, template):
    templates = []
    for site_settings_module in settings.ADMIN_FOR:
        settings_mod = __import__(site_settings_module, '', '', [''])
        for dir in settings_mod.TEMPLATE_DIRS:
            template_file = os.path.join(dir, "%s.html" % template)
            templates.append({
                'file'      : template_file,
                'exists'    : os.path.exists(template_file),
                'contents'  : lambda: os.path.exists(template_file) and open(template_file).read() or '',
                'site_id'   : settings_mod.SITE_ID,
                'site'      : sites.get_object(pk=settings_mod.SITE_ID),
                'order'     : list(settings_mod.TEMPLATE_DIRS).index(dir),
            })
    return render_to_response('admin_doc/template_detail', {
        'name': template,
        'templates': templates,
    }, context_instance=DjangoContext(request))
Ejemplo n.º 19
0
def view_index(request):
    if not doc:
        return missing_docutils_page(request)

    views = []
    for site_settings_module in settings.ADMIN_FOR:
        settings_mod = __import__(site_settings_module, '', '', [''])
        urlconf = __import__(settings_mod.ROOT_URLCONF, '', '', [''])
        view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
        for (func, regex) in view_functions:
            views.append({
                'name'   : func.__name__,
                'module' : func.__module__,
                'site_id': settings_mod.SITE_ID,
                'site'   : sites.get_object(pk=settings_mod.SITE_ID),
                'url'    : simplify_regex(regex),
            })
    return render_to_response('admin_doc/view_index', {'views': views}, context_instance=DjangoContext(request))
Ejemplo n.º 20
0
def login(request):
    try:
        user = users.get_object(username__exact=request.POST["username"])
        if not user.check_password(request.POST["password"]):
            raise users.UserDoesNotExist
        # set the session's user active
        request.session[users.SESSION_KEY] = user.id
        try:
            nextpage = request.GET["next"]
        except KeyError:
            nextpage = "/gappy/"
        return HttpResponseRedirect(nextpage)
    except KeyError:
        return render_to_response("gappy/login")
    except users.UserDoesNotExist:
        t = loader.get_template("gappy/login")
        c = Context({"error":"Some login information was wrong."})
        return HttpResponse(t.render(c))
Ejemplo n.º 21
0
def comment_was_posted(request):
    """
    Display "comment was posted" success page

    Templates: `comment_posted`
    Context:
        object
            The object the comment was posted on
    """
    obj = None
    if request.GET.has_key('c'):
        content_type_id, object_id = request.GET['c'].split(':')
        try:
            content_type = contenttypes.get_object(pk=content_type_id)
            obj = content_type.get_object_for_this_type(pk=object_id)
        except ObjectDoesNotExist:
            pass
    return render_to_response('comments/posted', {'object': obj}, context_instance=DjangoContext(request))
Ejemplo n.º 22
0
def login(request):
    "Displays the login form and handles the login action."
    manipulator = AuthenticationForm(request)
    redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '')
    if request.POST:
        errors = manipulator.get_validation_errors(request.POST)
        if not errors:
            # Light security check -- make sure redirect_to isn't garbage.
            if not redirect_to or '://' in redirect_to or ' ' in redirect_to:
                redirect_to = '/accounts/profile/'
            request.session[users.SESSION_KEY] = manipulator.get_user_id()
            request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)
    else:
        errors = {}
    request.session.set_test_cookie()
    return render_to_response('registration/login', {
        'form': formfields.FormWrapper(manipulator, request.POST, errors),
        REDIRECT_FIELD_NAME: redirect_to,
        'site_name': sites.get_current().name,
    }, context_instance=DjangoContext(request))
Ejemplo n.º 23
0
def model_detail(request, model):
    if not doc:
        return missing_docutils_page(request)

    try:
        model = meta.get_app(model)
    except ImportError:
        raise Http404
    opts = model.Klass._meta

    # Gather fields/field descriptions
    fields = []
    for field in opts.fields:
        fields.append({
            'name'     : field.name,
            'data_type': get_readable_field_data_type(field),
            'verbose'  : field.verbose_name,
            'help'     : field.help_text,
        })
    for func_name, func in model.Klass.__dict__.items():
        if callable(func) and len(inspect.getargspec(func)[0]) == 0:
            try:
                for exclude in MODEL_METHODS_EXCLUDE:
                    if func_name.startswith(exclude):
                        raise StopIteration
            except StopIteration:
                continue
            verbose = func.__doc__
            if verbose:
                verbose = doc.parse_rst(doc.trim_docstring(verbose), 'model', 'model:' + opts.module_name)
            fields.append({
                'name'      : func_name,
                'data_type' : get_return_data_type(func_name),
                'verbose'   : verbose,
            })
    return render_to_response('admin_doc/model_detail', {
        'name': '%s.%s' % (opts.app_label, opts.module_name),
        'summary': "Fields on %s objects" % opts.verbose_name,
        'fields': fields,
    }, context_instance=DjangoContext(request))
Ejemplo n.º 24
0
def view_detail(request, view):
    if not doc:
        return missing_docutils_page(request)

    mod, func = urlresolvers.get_mod_func(view)
    try:
        view_func = getattr(__import__(mod, '', '', ['']), func)
    except (ImportError, AttributeError):
        raise Http404
    title, body, metadata = doc.parse_docstring(view_func.__doc__)
    if title:
        title = doc.parse_rst(title, 'view', 'view:' + view)
    if body:
        body = doc.parse_rst(body, 'view', 'view:' + view)
    for key in metadata:
        metadata[key] = doc.parse_rst(metadata[key], 'model', 'view:' + view)
    return render_to_response('admin_doc/view_detail', {
        'name': view,
        'summary': title,
        'body': body,
        'meta': metadata,
    }, context_instance=DjangoContext(request))
Ejemplo n.º 25
0
def template_validator(request):
    """
    Displays the template validator form, which finds and displays template
    syntax errors.
    """
    # get a dict of {site_id : settings_module} for the validator
    settings_modules = {}
    for mod in settings.ADMIN_FOR:
        settings_module = __import__(mod, "", "", [""])
        settings_modules[settings_module.SITE_ID] = settings_module
    manipulator = TemplateValidator(settings_modules)
    new_data, errors = {}, {}
    if request.POST:
        new_data = request.POST.copy()
        errors = manipulator.get_validation_errors(new_data)
        if not errors:
            request.user.add_message("The template is valid.")
    return render_to_response(
        "admin/template_validator",
        {"title": "Template validator", "form": formfields.FormWrapper(manipulator, new_data, errors)},
        context_instance=DjangoContext(request),
    )
Ejemplo n.º 26
0
def vote(request, comment_id, vote):
    """
    Rate a comment (+1 or -1)

    Templates: `karma_vote_accepted`
    Context:
        comment
            `comments.comments` object being rated
    """
    rating = {'up': 1, 'down': -1}.get(vote, False)
    if not rating:
        raise Http404, "Invalid vote"
    if request.user.is_anonymous():
        raise Http404, "Anonymous users cannot vote"
    try:
        comment = comments.get_object(pk=comment_id)
    except comments.CommentDoesNotExist:
        raise Http404, "Invalid comment ID"
    if comment.user_id == request.user.id:
        raise Http404, "No voting for yourself"
    karma.vote(request.user.id, comment_id, rating)
    # Reload comment to ensure we have up to date karma count
    comment = comments.get_object(pk=comment_id)
    return render_to_response('comments/karma_vote_accepted', {'comment': comment}, context_instance=DjangoContext(request))
Ejemplo n.º 27
0
def template_tag_index(request):
    import sys

    if not doc:
        return missing_docutils_page(request)

    # We have to jump through some hoops with registered_tags to make sure
    # they don't get messed up by loading outside tagsets
    saved_tagset = template.registered_tags.copy(), template.registered_filters.copy()
    load_all_installed_template_libraries()

    # Gather docs
    tags = []
    for tagname in template.registered_tags:
        title, body, metadata = doc.parse_docstring(template.registered_tags[tagname].__doc__)
        if title:
            title = doc.parse_rst(title, 'tag', 'tag:' + tagname)
        if body:
            body = doc.parse_rst(body, 'tag', 'tag:' + tagname)
        for key in metadata:
            metadata[key] = doc.parse_rst(metadata[key], 'tag', 'tag:' + tagname)
        library = template.registered_tags[tagname].__module__.split('.')[-1]
        if library == 'template_loader' or library == 'defaulttags':
            library = None
        tags.append({
            'name'    : tagname,
            'title'   : title,
            'body'    : body,
            'meta'    : metadata,
            'library' : library,
        })

    # Fix registered_tags
    template.registered_tags, template.registered_filters = saved_tagset

    return render_to_response('admin_doc/template_tag_index', {'tags': tags}, context_instance=DjangoContext(request))
Ejemplo n.º 28
0
def delete(request, comment_id):
    """
    Deletes a comment. Confirmation on GET, action on POST.

    Templates: `comments/delete_verify`, `comments/delete_done`
    Context:
        comment
            the flagged `comments.comments` object
    """
    try:
        comment = comments.get_object(pk=comment_id, site__id__exact=SITE_ID)
    except comments.CommentDoesNotExist:
        raise Http404
    if not comments.user_is_moderator(request.user):
        raise Http404
    if request.POST:
        # If the comment has already been removed, silently fail.
        if not comment.is_removed:
            comment.is_removed = True
            comment.save()
            m = moderatordeletions.ModeratorDeletion(None, request.user.id, comment.id, None)
            m.save()
        return HttpResponseRedirect('%sdone/' % request.path)
    return render_to_response('comments/delete_verify', {'comment': comment}, context_instance=DjangoContext(request))
Ejemplo n.º 29
0
def direct_to_template(request, template, **kwargs):
    """
    Render a given template with any extra URL parameters in the context as 
    ``{{ params }}``.
    """
    return render_to_response(template, {'params' : kwargs}, context_instance=DjangoContext(request))
Ejemplo n.º 30
0
def index(request):
    return render_to_response('list', {'address': address})
Ejemplo n.º 31
0
def edit(request, pagename):
    """显示编辑存在页面"""
    page = wikis.get_object(pagename__exact=pagename)
    return render_to_response('wiki/edit', {'pagename':pagename, 'content':page.content})
Ejemplo n.º 32
0
def post_comment(request):
    """
    Post a comment

    Redirects to the `comments.comments.comment_was_posted` view upon success.

    Templates: `comment_preview`
    Context:
        comment
            the comment being posted
        comment_form
            the comment form
        options
            comment options
        target
            comment target
        hash
            security hash (must be included in a posted form to succesfully
            post a comment).
        rating_options
            comment ratings options
        ratings_optional
            are ratings optional?
        ratings_required
            are ratings required?
        rating_range
            range of ratings
        rating_choices
            choice of ratings
    """
    if not request.POST:
        raise Http404, "Only POSTs are allowed"
    try:
        options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
    except KeyError:
        raise Http404, "One or more of the required fields wasn't submitted"
    photo_options = request.POST.get('photo_options', '')
    rating_options = normalize_newlines(request.POST.get('rating_options', ''))
    if comments.get_security_hash(options, photo_options, rating_options, target) != security_hash:
        raise Http404, "Somebody tampered with the comment form (security violation)"
    # Now we can be assured the data is valid.
    if rating_options:
        rating_range, rating_choices = comments.get_rating_options(base64.decodestring(rating_options))
    else:
        rating_range, rating_choices = [], []
    content_type_id, object_id = target.split(':') # target is something like '52:5157'
    try:
        obj = contenttypes.get_object(pk=content_type_id).get_object_for_this_type(pk=object_id)
    except ObjectDoesNotExist:
        raise Http404, "The comment form had an invalid 'target' parameter -- the object ID was invalid"
    option_list = options.split(',') # options is something like 'pa,ra'
    new_data = request.POST.copy()
    new_data['content_type_id'] = content_type_id
    new_data['object_id'] = object_id
    new_data['ip_address'] = request.META.get('REMOTE_ADDR')
    new_data['is_public'] = comments.IS_PUBLIC in option_list
    manipulator = PublicCommentManipulator(request.user,
        ratings_required=comments.RATINGS_REQUIRED in option_list,
        ratings_range=rating_range,
        num_rating_choices=len(rating_choices))
    errors = manipulator.get_validation_errors(new_data)
    # If user gave correct username/password and wasn't already logged in, log them in
    # so they don't have to enter a username/password again.
    if manipulator.get_user() and new_data.has_key('password') and manipulator.get_user().check_password(new_data['password']):
        request.session[users.SESSION_KEY] = manipulator.get_user_id()
    if errors or request.POST.has_key('preview'):
        class CommentFormWrapper(formfields.FormWrapper):
            def __init__(self, manipulator, new_data, errors, rating_choices):
                formfields.FormWrapper.__init__(self, manipulator, new_data, errors)
                self.rating_choices = rating_choices
            def ratings(self):
                field_list = [self['rating%d' % (i+1)] for i in range(len(rating_choices))]
                for i, f in enumerate(field_list):
                    f.choice = rating_choices[i]
                return field_list
        comment = errors and '' or manipulator.get_comment(new_data)
        comment_form = CommentFormWrapper(manipulator, new_data, errors, rating_choices)
        return render_to_response('comments/preview', {
            'comment': comment,
            'comment_form': comment_form,
            'options': options,
            'target': target,
            'hash': security_hash,
            'rating_options': rating_options,
            'ratings_optional': comments.RATINGS_OPTIONAL in option_list,
            'ratings_required': comments.RATINGS_REQUIRED in option_list,
            'rating_range': rating_range,
            'rating_choices': rating_choices,
        }, context_instance=DjangoContext(request))
    elif request.POST.has_key('post'):
        # If the IP is banned, mail the admins, do NOT save the comment, and
        # serve up the "Thanks for posting" page as if the comment WAS posted.
        if request.META['REMOTE_ADDR'] in BANNED_IPS:
            mail_admins("Banned IP attempted to post comment", str(request.POST) + "\n\n" + str(request.META))
        else:
            manipulator.do_html2python(new_data)
            comment = manipulator.save(new_data)
        return HttpResponseRedirect("/comments/posted/?c=%s:%s" % (content_type_id, object_id))
    else:
        raise Http404, "The comment form didn't provide either 'preview' or 'post'"
Ejemplo n.º 33
0
def post_free_comment(request):
    """
    Post a free comment (not requiring a log in)

    Redirects to `comments.comments.comment_was_posted` view on success.

    Templates: `comment_free_preview`
    Context:
        comment
            comment being posted
        comment_form
            comment form object
        options
            comment options
        target
            comment target
        hash
            security hash (must be included in a posted form to succesfully
            post a comment).
    """
    if not request.POST:
        raise Http404, "Only POSTs are allowed"
    try:
        options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
    except KeyError:
        raise Http404, "One or more of the required fields wasn't submitted"
    if comments.get_security_hash(options, '', '', target) != security_hash:
        raise Http404, "Somebody tampered with the comment form (security violation)"
    content_type_id, object_id = target.split(':') # target is something like '52:5157'
    content_type = contenttypes.get_object(pk=content_type_id)
    try:
        obj = content_type.get_object_for_this_type(pk=object_id)
    except ObjectDoesNotExist:
        raise Http404, "The comment form had an invalid 'target' parameter -- the object ID was invalid"
    option_list = options.split(',')
    new_data = request.POST.copy()
    new_data['content_type_id'] = content_type_id
    new_data['object_id'] = object_id
    new_data['ip_address'] = request.META['REMOTE_ADDR']
    new_data['is_public'] = comments.IS_PUBLIC in option_list
    manipulator = PublicFreeCommentManipulator()
    errors = manipulator.get_validation_errors(new_data)
    if errors or request.POST.has_key('preview'):
        comment = errors and '' or manipulator.get_comment(new_data)
        return render_to_response('comments/free_preview', {
            'comment': comment,
            'comment_form': formfields.FormWrapper(manipulator, new_data, errors),
            'options': options,
            'target': target,
            'hash': security_hash,
        }, context_instance=DjangoContext(request))
    elif request.POST.has_key('post'):
        # If the IP is banned, mail the admins, do NOT save the comment, and
        # serve up the "Thanks for posting" page as if the comment WAS posted.
        if request.META['REMOTE_ADDR'] in BANNED_IPS:
            from django.core.mail import mail_admins
            mail_admins("Practical joker", str(request.POST) + "\n\n" + str(request.META))
        else:
            manipulator.do_html2python(new_data)
            comment = manipulator.save(new_data)
        return HttpResponseRedirect("/comments/posted/?c=%s:%s" % (content_type_id, object_id))
    else:
        raise Http404, "The comment form didn't provide either 'preview' or 'post'"