Пример #1
0
def page_not_found(request, **args):
    from django.template import RequestContext, loader
    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
    }
    t = loader.get_template('404.html')
    return HttpResponseNotFound(t.render(RequestContext(request, {'page': page})))
Пример #2
0
def page_not_found(request, **args):
    from django.template import RequestContext, loader
    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
    }
    t = loader.get_template('404.html')
    return HttpResponseNotFound(
        t.render(RequestContext(request, {'page': page})))
Пример #3
0
def openid(request, **args):
    authed = request.user.is_authenticated() and request.user.is_staff
    if not authed:
        return HttpResponseForbidden()

    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'themes': settings.THEMES,
        'themes_more': True if len(settings.THEMES) > 1 else False,
        'theme': common.get_theme(request),
        'title': _('OpenID - Settings'),
        'menu': 'openid',
    }

    openid_url = request.POST.get('openid_identifier', None)
    if openid_url:
        rs = gls_openid.start(request, openid_url)
        if 'res' in rs:
            return rs['res']
        elif 'msg' in rs:
            page['msg'] = rs['msg']

    elif request.GET.get('openid.mode', None):
        rs = gls_openid.finish(request)
        if 'identity_url' in rs:
            try:
                db = OpenId(user=request.user, identity=rs['identity_url'])
                db.save()
                return HttpResponseRedirect(
                    urlresolvers.reverse('glifestream.usettings.views.openid'))
            except IntegrityError:
                pass
        elif 'msg' in rs:
            page['msg'] = rs['msg']

    elif request.POST.get('delete', None):
        try:
            OpenId(user=request.user,
                   id=int(request.POST.get('delete'))).delete()
        except:
            pass

    ids = OpenId.objects.filter(user=request.user).order_by('identity')
    return render_to_response('oid.html', {'page': page, 'authed': authed,
                                           'is_secure': request.is_secure(),
                                           'user': request.user,
                                           'openids': ids})
Пример #4
0
def pshb(request, **args):
    authed = request.user.is_authenticated() and request.user.is_staff
    if not authed:
        return HttpResponseForbidden()

    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'themes': settings.THEMES,
        'themes_more': True if len(settings.THEMES) > 1 else False,
        'theme': common.get_theme(request),
        'title': _('PubSubHubbub - Settings'),
        'menu': 'pshb',
    }
    excluded_apis = ('selfposts', 'fb', 'friendfeed', 'twitter', 'vimeo')

    if request.POST.get('subscribe', False):
        service = Service.objects.get(id=request.POST['subscribe'])
        r = gls_pshb.subscribe(service)
        if r['rc'] == 1:
            page['msg'] = r['error']
        elif r['rc'] == 2:
            page['msg'] = _('Hub not found.')
        elif r['rc'] == 202:
            page['msg'] = _('Hub %s: Accepted for verification.') % r['hub']
        elif r['rc'] == 204:
            page['msg'] = _('Hub %s: Subscription verified.') % r['hub']

    elif request.POST.get('unsubscribe', False):
        r = gls_pshb.unsubscribe(request.POST['unsubscribe'])
        if r['rc'] == 1:
            page['msg'] = _('No subscription found.')
        elif r['rc'] == 202:
            page['msg'] = _('Hub %s: Accepted for verification.') % r['hub']
        elif r['rc'] == 204:
            page['msg'] = _('Hub %s: Unsubscribed.') % r['hub']
        else:
            page['msg'] = 'Hub %s: %s.' % (r['hub'], r['rc'])

    subs = gls_pshb.list(raw=True)
    services = Service.objects.exclude (api__in=excluded_apis) \
        .exclude(id__in=subs.values('service__id')).order_by('name')

    return render_to_response('pshb.html', {'page': page, 'authed': authed,
                                            'is_secure': request.is_secure(),
                                            'user': request.user,
                                            'services': services,
                                            'subs': subs})
Пример #5
0
def tools(request, **args):
    authed = request.user.is_authenticated() and request.user.is_staff
    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'themes': settings.THEMES,
        'themes_more': True if len(settings.THEMES) > 1 else False,
        'theme': common.get_theme(request),
        'title': _('Tools'),
        'menu': 'tools',
    }
    return render_to_response('tools.html', {'page': page, 'authed': authed,
                                             'is_secure': request.is_secure(),
                                             'user': request.user})
Пример #6
0
def lists(request, **args):
    authed = request.user.is_authenticated() and request.user.is_staff
    if not authed:
        return HttpResponseForbidden()

    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'themes': settings.THEMES,
        'themes_more': True if len(settings.THEMES) > 1 else False,
        'theme': common.get_theme(request),
        'title': _('Lists - Settings'),
        'menu': 'lists',
    }
    curlist = ''
    lists = List.objects.filter(user=request.user).order_by('name')

    if 'list' in args:
        try:
            list = List.objects.get(user=request.user, slug=args['list'])
            curlist = args['list']
        except List.DoesNotExist:
            list = List(user=request.user)
    else:
        list = List(user=request.user)

    if request.method == 'POST':
        if request.POST.get('delete', False):
            list.delete()
            return HttpResponseRedirect(
                urlresolvers.reverse('glifestream.usettings.views.lists'))
        else:
            form = ListForm(request.POST, instance=list)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect(
                    urlresolvers.reverse('glifestream.usettings.views.lists',
                                         args=[list.slug]))
    else:
        form = ListForm(instance=list)

    return render_to_response('lists.html', {'page': page, 'authed': authed,
                                             'is_secure': request.is_secure(),
                                             'user': request.user,
                                             'lists': lists,
                                             'curlist': curlist,
                                             'form': form})
Пример #7
0
def login(request,
          template_name='login.html',
          redirect_field_name=REDIRECT_FIELD_NAME):

    redirect_to = request.REQUEST.get(redirect_field_name,
                                      urlresolvers.reverse('index'))

    if request.method == 'POST':
        form = AuthenticationRememberMeForm(data=request.POST, )
        if form.is_valid():
            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = settings.BASE_URL + '/'

            if not form.cleaned_data['remember_me']:
                request.session.set_expiry(0)

            from django.contrib.auth import login
            login(request, form.get_user())

            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()

            return HttpResponseRedirect(redirect_to)
    else:
        form = AuthenticationRememberMeForm(request, )

    request.session.set_test_cookie()

    if Site._meta.installed:
        current_site = Site.objects.get_current()
    else:
        current_site = RequestSite(request)

    page = {
        'robots': 'noindex,nofollow',
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
    }

    return render_to_response(template_name, {
        'page': page,
        'form': form,
        'site': current_site,
        'site_name': current_site.name,
        'is_secure': request.is_secure(),
        redirect_field_name: redirect_to
    },
                              context_instance=RequestContext(request))
Пример #8
0
def login(request, template_name='login.html',
          redirect_field_name=REDIRECT_FIELD_NAME):

    redirect_to = request.REQUEST.get(redirect_field_name,
                                      urlresolvers.reverse('index'))

    if request.method == 'POST':
        form = AuthenticationRememberMeForm(data=request.POST,)
        if form.is_valid():
            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = settings.BASE_URL + '/'

            if not form.cleaned_data['remember_me']:
                request.session.set_expiry(0)

            from django.contrib.auth import login
            login(request, form.get_user())

            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()

            return HttpResponseRedirect(redirect_to)
    else:
        form = AuthenticationRememberMeForm(request,)

    request.session.set_test_cookie()

    if Site._meta.installed:
        current_site = Site.objects.get_current()
    else:
        current_site = RequestSite(request)

    page = {
        'robots': 'noindex,nofollow',
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
    }

    return render_to_response(template_name,
                              {'page': page,
                               'form': form,
                               'site': current_site,
                               'site_name': current_site.name,
                               'is_secure': request.is_secure(),
                               redirect_field_name: redirect_to},
                              context_instance=RequestContext(request))
Пример #9
0
def services(request, **args):
    authed = request.user.is_authenticated() and request.user.is_staff
    if not authed:
        return HttpResponseForbidden()

    page = {
        'robots': 'noindex',
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'themes': settings.THEMES,
        'fb_app_id': settings.FACEBOOK_APP_ID,
        'themes_more': True if len(settings.THEMES) > 1 else False,
        'theme': common.get_theme(request),
        'title': _('Services - Settings'),
        'menu': 'services',
    }

    services = Service.objects.all().order_by('api', 'name')
    return render_to_response(
        'services.html', {'page': page, 'authed': authed,
                          'is_secure': request.is_secure(),
                          'user': request.user,
                          'services_supported': API_LIST,
                          'services': services})
Пример #10
0
def index(request, **args):
    site_url = '%s://%s' % (request.is_secure() and 'https'
                            or 'http', request.get_host())
    page = {
        'ctx': args.get('ctx', ''),
        'backtime': True,
        'robots': 'index',
        'public': False,
        'site_url': site_url,
        'base_url': settings.BASE_URL,
        'login_url': settings.LOGIN_URL,
        'favicon': settings.FAVICON,
        'author_name': settings.FEED_AUTHOR_NAME,
        'author_uri': getattr(settings, 'FEED_AUTHOR_URI', False),
        'taguri': settings.FEED_TAGURI,
        'icon': settings.FEED_ICON,
        'maps_engine': settings.MAPS_ENGINE,
        'fb_app_id': settings.FACEBOOK_APP_ID,
        'pshb_hubs': settings.PSHB_HUBS,
    }
    authed = request.user.is_authenticated() and request.user.is_staff
    friend = request.user.is_authenticated() and not request.user.is_staff
    urlparams = []
    entries_on_page = settings.ENTRIES_ON_PAGE
    entries_orderby = 'date_published'

    # Entries filter.
    fs = {'active': True, 'service__home': True}

    # Filter by dates.
    year = int(args.get('year', 0))
    month = int(args.get('month', 0))
    day = int(args.get('day', 0))
    if year:
        fs[entries_orderby + '__year'] = year
    if month:
        fs[entries_orderby + '__month'] = month
    if day:
        fs[entries_orderby + '__day'] = day
    if year and month and day:
        dt = datetime.date(year, month, day).strftime('%Y/%m/%d')
    elif year and month:
        dt = datetime.date(year, month, 1)
        prev, next = pn_month_start(dt)
        page['month_nav'] = True
        page['month_prev'] = prev.strftime('%Y/%m')
        page['month_next'] = next.strftime('%Y/%m')
        dt = dt.strftime('%Y/%m')
    elif year:
        dt = datetime.date(year, 1, 1).strftime('%Y')

    if year:
        page['backtime'] = False
        page['title'] = dt
        page['subtitle'] = _('You are currently browsing the archive for %s'
                             ) % ('<b>' + dt + '</b>')
        page['robots'] = 'noindex'

    if page['backtime']:
        entries = Entry.objects.order_by('-' + entries_orderby)
    else:
        entries = Entry.objects.order_by(entries_orderby)

    if not authed:
        fs['draft'] = False
    if not authed or page['ctx'] == 'public':
        fs['service__public'] = True
        page['public'] = True

    # Filter for favorites.
    if page['ctx'] == 'favorites':
        if not authed:
            return HttpResponseRedirect(settings.BASE_URL + '/')
        favs = Favorite.objects.filter(user__id=request.user.id)
        page['favorites'] = True
        page['title'] = _('Favorites')
        page['subtitle'] = _(
            'You are currently browsing your favorite entries')
        fs['id__in'] = favs.values('entry')

    # Filter lists.
    elif 'list' in args:
        try:
            services = List.objects.get(user__id=request.user.id,
                                        slug=args['list']).services
            del fs['service__home']
            fs['service__id__in'] = services.values('id')
            page['ctx'] = 'list/' + args['list']
            page['title'] = args['list']
            page['subtitle'] = _(
                'You are currently browsing entries from %s list only.') % (
                    '<b>' + args['list'] + '</b>')
        except List.DoesNotExist:
            if authed:
                raise Http404

    # Filter for exactly one given entry.
    elif 'entry' in args:
        fs['id__exact'] = int(args['entry'])
        page['exactentry'] = True
        if authed and 'service__public' in fs:
            del fs['service__public']

    if not authed:
        page['ctx'] = ''

    # Filter by class type.
    cls = request.GET.get('class', 'all')
    if cls != 'all':
        fs['service__cls'] = cls
        urlparams.append('class=' + cls)
        page['robots'] = 'noindex'
        if 'subtitle' in page:
            page['subtitle'] += ' <b>(%s)</b>' % escape(cls.capitalize())
        else:
            page['subtitle'] = _('You are currently browsing %s entries only.'
                                 ) % ('<b>' + escape(cls) + '</b>')

    # Filter by author name.
    author = request.GET.get('author', 'all')
    if author != 'all':
        fs['author_name'] = author
        urlparams.append('author=' + author)
        page['robots'] = 'noindex'

    # Filter by service type.
    srvapi = request.GET.get('service', 'all')
    if srvapi != 'all':
        fs['service__api'] = srvapi
        urlparams.append('service=' + srvapi)
        page['robots'] = 'noindex'
        srvapi_name = dict(API_LIST).get(srvapi, srvapi.capitalize())
        if 'subtitle' in page:
            page['subtitle'] += ' <b>(%s)</b>' % escape(srvapi_name)
        else:
            page['subtitle'] = _(
                'You are currently browsing entries from %s service only.') % (
                    '<b>' + escape(srvapi_name) + '</b>')

    # Filter entries after specified timestamp 'start'.
    after = False
    start = request.GET.get('start', False)
    if start:
        qs = fs.copy()
        try:
            dt = datetime.datetime.fromtimestamp(float(start))
        except ValueError:
            raise Http404

        if page['backtime']:
            fs[entries_orderby + '__lte'] = dt
            qs[entries_orderby + '__gt'] = fs[entries_orderby + '__lte']
            q = Entry.objects.order_by(entries_orderby)
        else:
            fs[entries_orderby + '__gte'] = dt
            qs[entries_orderby + '__lt'] = fs[entries_orderby + '__gte']
            q = Entry.objects.order_by('-' + entries_orderby)

        q = q.filter(**qs)[0:entries_on_page].values(entries_orderby)
        if len(q):
            after = q[len(q) - 1][entries_orderby]
            after = int(time.mktime(after.timetuple()))
        page['title'] = '%s' % str(dt)[0:-3]
        page['robots'] = 'noindex'

    # Search/Query entries.
    search_enable = getattr(settings, 'SEARCH_ENABLE', False)
    search_engine = getattr(settings, 'SEARCH_ENGINE', 'sphinx')
    search_query = request.GET.get('s', '')

    if search_query != '' and search_enable:
        page['search'] = search_query
        page['title'] = 'Search Results for %s' % escape(search_query)
        page['subtitle'] = _(
            'Your search for %s returned the following results.') % (
                '<b>' + escape(search_query) + '</b>')
        urlparams.append('s=' + search_query)
        sfs = {}
        if not authed and not friend:
            sfs['friends_only'] = False
        page_number = int(request.GET.get('page', 1))
        offset = (page_number - 1) * entries_on_page

        try:
            if search_engine == 'sphinx':
                select = "SELECT * FROM %s WHERE MATCH('%s')"
                if page['public']:
                    select += ' AND public=1'
                if 'friends_only' in sfs and sfs['friends_only'] == False:
                    select += ' AND friends_only=0'
                select += ' LIMIT 1000'

                cursor = connections['sphinx'].cursor()
                cursor.execute(select %
                               (settings.SPHINX_INDEX_NAME, search_query))
                res = __dictfetchall(cursor)
                uids = [ent['id'] for ent in res]
                entries = entries.filter(id__in=uids).select_related()
            else:  # db search
                if page['public']:
                    sfs['service__public'] = True
                sfs['content__icontains'] = search_query
                entries = entries.filter(**sfs).select_related()

            limit = offset + entries_on_page
            if offset >= entries_on_page:
                page['prevpage'] = page_number - 1
            if limit < entries.count():
                page['nextpage'] = page_number + 1

            entries = entries[offset:limit]
        except:
            entries = []

        start = False

    # If not search, then normal query.
    else:
        entries = entries.filter(**fs)[0:entries_on_page + 1].select_related()
        num = len(entries)

        if 'exactentry' in page and num:
            page['title'] = truncatewords(entries[0].title, 7)

        # Time-based pagination.
        if num > entries_on_page:
            start = entries[num - 1].__getattribute__(entries_orderby)
            start = int(time.mktime(start.timetuple()))
        else:
            start = False

        entries = entries[0:entries_on_page]

        if num:
            crymax = entries[0].date_published.year
            crymin = entries[len(entries) - 1].date_published.year
            if crymin != crymax:
                page['copyright_years'] = '%s-%s' % (crymin, crymax)
            else:
                page['copyright_years'] = crymin

    # Build URL params for links.
    if len(urlparams):
        urlparams = '?' + reduce(
            lambda x, y: six.text_type(x) + '&' + six.text_type(y), urlparams,
            '')[1:] + '&'
    else:
        urlparams = '?'

    if len(entries):
        page['updated'] = entries[0].date_published
    else:
        page['updated'] = datetime.datetime.utcnow()
    page['urlparams'] = urlparams
    page['start'] = start
    page['after'] = after

    if hasattr(settings, 'STREAM_TITLE'):
        page_title = settings.STREAM_TITLE
    else:
        page_title = None

    if hasattr(settings, 'STREAM_DESCRIPTION'):
        page['description'] = settings.STREAM_DESCRIPTION

    # Set page theme.
    page['themes'] = settings.THEMES
    page['themes_more'] = True if len(settings.THEMES) > 1 else False
    page['theme'] = common.get_theme(request)

    # Setup links.
    page['need_fbc'] = False
    for entry in entries:
        entry.only_for_friends = entry.friends_only

        if authed or friend:
            entry.friends_only = False
        elif entry.friends_only:
            page['need_fbc'] = True

        if not entry.friends_only:
            entry.gls_link = '%s/%s' % (urlresolvers.reverse(
                'entry', args=[entry.id
                               ]), gls_slugify(truncatewords(entry.title, 7)))
        else:
            entry.gls_link = '%s/' % (urlresolvers.reverse('entry',
                                                           args=[entry.id]))
            if 'title' in page:
                del page['title']

        entry.gls_absolute_link = '%s%s' % (page['site_url'], entry.gls_link)

    # Check single-entry URL
    if 'exactentry' in page:
        if len(entries):
            gls_link = entries[0].gls_link
            if gls_link != request.path:
                return HttpResponsePermanentRedirect(gls_link)
            page['canonical_link'] = urllib.parse.urljoin(
                settings.BASE_URL, gls_link)
        else:
            raise Http404

    if 'title' in page and page['title'] != '':
        if page_title:
            page['title'] += getattr(settings, 'STREAM_TITLE_SUFFIX',
                                     ' | ' + page_title)
    elif page_title:
        page['title'] = page_title

    # Pickup right output format and finish.
    format = request.GET.get('format', 'html')
    if format == 'atom':
        return render_to_response('stream.atom', {
            'entries': entries,
            'page': page
        },
                                  content_type='application/atom+xml')
    elif format == 'json':
        cb = request.GET.get('callback', False)
        return render_to_response('stream.json', {
            'entries': entries,
            'page': page,
            'callback': cb
        },
                                  content_type='application/json')
    elif format == 'html-pure' and request.is_ajax():
        # Check which entry is already favorite.
        if authed and page['ctx'] != 'favorites':
            ents = [entry.id for entry in entries]
            favs = Favorite.objects.filter(user__id=request.user.id,
                                           entry__id__in=ents)
            favs = [f.entry_id for f in favs]
            for entry in entries:
                if entry.id in favs:
                    entry.fav = True
                if entry.service.api in ('twitter', 'identica'):
                    entry.sms = True
        d = {
            'next':
            page['start'],
            'stream':
            strip_spaces_between_tags(
                render_to_string(
                    'stream-pure.html', {
                        'entries': entries,
                        'page': page,
                        'authed': authed,
                        'friend': friend
                    })),
        }
        if 'nextpage' in page:
            d['next'] = page['nextpage']
        return HttpResponse(json.dumps(d), content_type='application/json')
    elif format != 'html':
        raise Http404
    else:
        # Check which entry is already favorite.
        if authed and page['ctx'] != 'favorites':
            ents = [entry.id for entry in entries]
            favs = Favorite.objects.filter(user__id=request.user.id,
                                           entry__id__in=ents)
            favs = [f.entry_id for f in favs]
            for entry in entries:
                if entry.id in favs:
                    entry.fav = True
                if entry.service.api in ('twitter', 'identica'):
                    entry.sms = True

        # Get lists.
        lists = List.objects.filter(user__id=request.user.id).order_by('name')

        # Get archives.
        if 'entry' in args:
            qs = {}
        else:
            qs = fs.copy()
            if year:
                del qs[entries_orderby + '__year']
            if month:
                del qs[entries_orderby + '__month']
            if day:
                del qs[entries_orderby + '__day']
        archs = Entry.objects.filter(**qs).dates('date_published',
                                                 'month',
                                                 order='DESC')
        page['months12'] = [datetime.date(2010, x, 1) for x in range(1, 13)]

        # List available classes.
        fs = {}
        if not authed or page['ctx'] == 'public':
            fs['public'] = True
        _classes = Service.objects.filter (**fs).order_by ('id')\
            .values('api', 'cls')
        classes = {}
        for item in _classes:
            if item['cls'] not in classes:
                classes[item['cls']] = item
        classes = list(classes.values())

        accept_lang = request.META.get('HTTP_ACCEPT_LANGUAGE', '').split(',')
        for i, lang in enumerate(accept_lang):
            accept_lang[i] = lang.split(';')[0]
        page['lang'] = accept_lang[0]

        request.user.fb_username = request.session.get('fb_username', '')
        request.user.fb_profile_url = request.session.get('fb_profile_url', '')

        res = render_to_response(
            'stream.html', {
                'classes': classes,
                'entries': entries,
                'lists': lists,
                'archives': archs,
                'page': page,
                'authed': authed,
                'friend': friend,
                'has_search': search_enable,
                'is_secure': request.is_secure(),
                'user': request.user
            })
        res['X-XRDS-Location'] = request.build_absolute_uri(
            urlresolvers.reverse('glifestream.gauth.views.xrds'))
        return res
Пример #11
0
def oauth(request, **args):
    authed = request.user.is_authenticated() and request.user.is_staff
    if not authed:
        return HttpResponseForbidden()

    page = {
        'base_url': settings.BASE_URL,
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
        'title': _('OAuth - Settings'),
    }
    apis_help = {
        'twitter': 'http://dev.twitter.com/pages/auth',
        'friendfeed': 'http://friendfeed.com/api/documentation#authentication',
    }
    v = {}
    id = args['id']

    callback_url = request.build_absolute_uri(
        urlresolvers.reverse('glifestream.usettings.views.oauth', args=[id]))

    service = Service.objects.get(id=id)
    c = gls_oauth.OAuth1Client(service=service,
                               identifier=request.POST.get('identifier'),
                               secret=request.POST.get('secret'),
                               callback_url=callback_url)

    if c.db.phase == 0 and (not c.request_token_url or
                            not c.authorize_url or
                            not c.access_token_url):
        v['request_token_url'] = request.POST.get('request_token_url', '')
        v['authorize_url'] = request.POST.get('authorize_url', '')
        v['access_token_url'] = request.POST.get('access_token_url', '')
        page['need_custom_urls'] = True

    if 'reset' in request.POST:
        c.reset()
        c.save()
    elif request.method == 'POST':
        if c.db.phase == 0:
            if not c.request_token_url:
                c.set_urls(v['request_token_url'],
                           v['authorize_url'],
                           v['access_token_url'])
            try:
                c.get_request_token()
            except Exception as e:
                page['msg'] = e
            c.save()
        if c.db.phase == 1:
            return HttpResponseRedirect(c.get_authorize_url())

    if request.method == 'GET':
        if c.db.phase == 1:
            if request.GET.get('oauth_token', '') == c.db.token:
                c.consumer.parse_authorization_response(
                    request.get_full_path())
                c.verifier = request.GET.get('oauth_verifier', None)
                c.db.phase = 2

        if c.db.phase == 2:
            try:
                c.get_access_token()
                c.save()
                return HttpResponseRedirect(urlresolvers.reverse(
                    'glifestream.usettings.views.oauth', args=[id]))
            except Exception as e:
                page['msg'] = e

    api_help = apis_help.get(service.api,
                             'http://oauth.net/documentation/getting-started/')

    return render_to_response('oauth.html', {'page': page,
                                             'is_secure': request.is_secure(),
                                             'title': six.text_type(service),
                                             'api_help': api_help,
                                             'callback_url': callback_url,
                                             'phase': c.db.phase,
                                             'v': v, })
Пример #12
0
def openid(request, template_name='openid.html',
           redirect_field_name=REDIRECT_FIELD_NAME):
    msg = None
    redirect_to = urlresolvers.reverse('index')
    if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
        redirect_to = settings.BASE_URL + '/'

    if not gls_openid.openid:
        return HttpResponseRedirect(redirect_to)

    if request.method == 'POST':
        form = OpenIdForm(data=request.POST,)
        if form.is_valid():
            if not form.cleaned_data['remember_me']:
                request.session.set_expiry(0)

            rs = gls_openid.start(request,
                                  form.cleaned_data['openid_identifier'])
            if 'res' in rs:
                return rs['res']
            elif 'msg' in rs:
                msg = rs['msg']
        else:
            msg = _('Invalid OpenID identifier')

    elif request.method == 'GET':

        if request.GET.get('openid.mode', None):
            rs = gls_openid.finish(request)
            if 'msg' in rs:
                msg = rs['msg']
            elif 'identity_url' in rs:
                try:
                    db = OpenId.objects.get(identity=rs['identity_url'])
                    if db:
                        user = db.user
                        user.backend = 'django.contrib.auth.backends.ModelBackend'
                        if user.is_active:
                            from django.contrib.auth import login
                            login(request, user)

                            if request.session.test_cookie_worked():
                                request.session.delete_test_cookie()
                            return HttpResponseRedirect(redirect_to)
                except OpenId.DoesNotExist:
                    pass
                msg = _('OpenID account match error')

    form = OpenIdForm(request,)
    request.session.set_test_cookie()

    if Site._meta.installed:
        current_site = Site.objects.get_current()
    else:
        current_site = RequestSite(request)

    page = {
        'robots': 'noindex,nofollow',
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
        'msg': msg,
    }

    return render_to_response(template_name,
                              {'page': page,
                               'form': form,
                               'site': current_site,
                               'site_name': current_site.name,
                               'is_secure': request.is_secure(),
                               redirect_field_name: redirect_to},
                              context_instance=RequestContext(request))
Пример #13
0
def openid(request,
           template_name='openid.html',
           redirect_field_name=REDIRECT_FIELD_NAME):
    msg = None
    redirect_to = urlresolvers.reverse('index')
    if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
        redirect_to = settings.BASE_URL + '/'

    if not gls_openid.openid:
        return HttpResponseRedirect(redirect_to)

    if request.method == 'POST':
        form = OpenIdForm(data=request.POST, )
        if form.is_valid():
            if not form.cleaned_data['remember_me']:
                request.session.set_expiry(0)

            rs = gls_openid.start(request,
                                  form.cleaned_data['openid_identifier'])
            if 'res' in rs:
                return rs['res']
            elif 'msg' in rs:
                msg = rs['msg']
        else:
            msg = _('Invalid OpenID identifier')

    elif request.method == 'GET':

        if request.GET.get('openid.mode', None):
            rs = gls_openid.finish(request)
            if 'msg' in rs:
                msg = rs['msg']
            elif 'identity_url' in rs:
                try:
                    db = OpenId.objects.get(identity=rs['identity_url'])
                    if db:
                        user = db.user
                        user.backend = 'django.contrib.auth.backends.ModelBackend'
                        if user.is_active:
                            from django.contrib.auth import login
                            login(request, user)

                            if request.session.test_cookie_worked():
                                request.session.delete_test_cookie()
                            return HttpResponseRedirect(redirect_to)
                except OpenId.DoesNotExist:
                    pass
                msg = _('OpenID account match error')

    form = OpenIdForm(request, )
    request.session.set_test_cookie()

    if Site._meta.installed:
        current_site = Site.objects.get_current()
    else:
        current_site = RequestSite(request)

    page = {
        'robots': 'noindex,nofollow',
        'favicon': settings.FAVICON,
        'theme': common.get_theme(request),
        'msg': msg,
    }

    return render_to_response(template_name, {
        'page': page,
        'form': form,
        'site': current_site,
        'site_name': current_site.name,
        'is_secure': request.is_secure(),
        redirect_field_name: redirect_to
    },
                              context_instance=RequestContext(request))
Пример #14
0
def index(request, **args):
    site_url = '%s://%s' % (request.is_secure() and 'https' or 'http',
                            request.get_host())
    page = {
        'ctx': args.get('ctx', ''),
        'backtime': True,
        'robots': 'index',
        'public': False,
        'site_url': site_url,
        'base_url': settings.BASE_URL,
        'login_url': settings.LOGIN_URL,
        'favicon': settings.FAVICON,
        'author_name': settings.FEED_AUTHOR_NAME,
        'author_uri': getattr(settings, 'FEED_AUTHOR_URI', False),
        'taguri': settings.FEED_TAGURI,
        'icon': settings.FEED_ICON,
        'maps_engine': settings.MAPS_ENGINE,
        'fb_app_id': settings.FACEBOOK_APP_ID,
        'pshb_hubs': settings.PSHB_HUBS,
    }
    authed = request.user.is_authenticated() and request.user.is_staff
    friend = request.user.is_authenticated() and not request.user.is_staff
    urlparams = []
    entries_on_page = settings.ENTRIES_ON_PAGE
    entries_orderby = 'date_published'

    # Entries filter.
    fs = {'active': True, 'service__home': True}

    # Filter by dates.
    year = int(args.get('year', 0))
    month = int(args.get('month', 0))
    day = int(args.get('day', 0))
    if year:
        fs[entries_orderby + '__year'] = year
    if month:
        fs[entries_orderby + '__month'] = month
    if day:
        fs[entries_orderby + '__day'] = day
    if year and month and day:
        dt = datetime.date(year, month, day).strftime('%Y/%m/%d')
    elif year and month:
        dt = datetime.date(year, month, 1)
        prev, next = pn_month_start(dt)
        page['month_nav'] = True
        page['month_prev'] = prev.strftime('%Y/%m')
        page['month_next'] = next.strftime('%Y/%m')
        dt = dt.strftime('%Y/%m')
    elif year:
        dt = datetime.date(year, 1, 1).strftime('%Y')

    if year:
        page['backtime'] = False
        page['title'] = dt
        page['subtitle'] = _(
            'You are currently browsing the archive for %s') % ('<b>' + dt + '</b>')
        page['robots'] = 'noindex'

    if page['backtime']:
        entries = Entry.objects.order_by('-' + entries_orderby)
    else:
        entries = Entry.objects.order_by(entries_orderby)

    if not authed:
        fs['draft'] = False
    if not authed or page['ctx'] == 'public':
        fs['service__public'] = True
        page['public'] = True

    # Filter for favorites.
    if page['ctx'] == 'favorites':
        if not authed:
            return HttpResponseRedirect(settings.BASE_URL + '/')
        favs = Favorite.objects.filter(user__id=request.user.id)
        page['favorites'] = True
        page['title'] = _('Favorites')
        page['subtitle'] = _(
            'You are currently browsing your favorite entries')
        fs['id__in'] = favs.values('entry')

    # Filter lists.
    elif 'list' in args:
        try:
            services = List.objects.get(user__id=request.user.id,
                                        slug=args['list']).services
            del fs['service__home']
            fs['service__id__in'] = services.values('id')
            page['ctx'] = 'list/' + args['list']
            page['title'] = args['list']
            page['subtitle'] = _('You are currently browsing entries from %s list only.') % (
                '<b>' + args['list'] + '</b>')
        except List.DoesNotExist:
            if authed:
                raise Http404

    # Filter for exactly one given entry.
    elif 'entry' in args:
        fs['id__exact'] = int(args['entry'])
        page['exactentry'] = True
        if authed and 'service__public' in fs:
            del fs['service__public']

    if not authed:
        page['ctx'] = ''

    # Filter by class type.
    cls = request.GET.get('class', 'all')
    if cls != 'all':
        fs['service__cls'] = cls
        urlparams.append('class=' + cls)
        page['robots'] = 'noindex'
        if 'subtitle' in page:
            page['subtitle'] += ' <b>(%s)</b>' % escape(cls.capitalize())
        else:
            page['subtitle'] = _('You are currently browsing %s entries only.') % (
                '<b>' + escape(cls) + '</b>')

    # Filter by author name.
    author = request.GET.get('author', 'all')
    if author != 'all':
        fs['author_name'] = author
        urlparams.append('author=' + author)
        page['robots'] = 'noindex'

    # Filter by service type.
    srvapi = request.GET.get('service', 'all')
    if srvapi != 'all':
        fs['service__api'] = srvapi
        urlparams.append('service=' + srvapi)
        page['robots'] = 'noindex'
        srvapi_name = dict(API_LIST).get(srvapi, srvapi.capitalize())
        if 'subtitle' in page:
            page['subtitle'] += ' <b>(%s)</b>' % escape(srvapi_name)
        else:
            page['subtitle'] = _('You are currently browsing entries from %s service only.') % (
                '<b>' + escape(srvapi_name) + '</b>')

    # Filter entries after specified timestamp 'start'.
    after = False
    start = request.GET.get('start', False)
    if start:
        qs = fs.copy()
        try:
            dt = datetime.datetime.fromtimestamp(float(start))
        except ValueError:
            raise Http404

        if page['backtime']:
            fs[entries_orderby + '__lte'] = dt
            qs[entries_orderby + '__gt'] = fs[entries_orderby + '__lte']
            q = Entry.objects.order_by(entries_orderby)
        else:
            fs[entries_orderby + '__gte'] = dt
            qs[entries_orderby + '__lt'] = fs[entries_orderby + '__gte']
            q = Entry.objects.order_by('-' + entries_orderby)

        q = q.filter(**qs)[0:entries_on_page].values(entries_orderby)
        if len(q):
            after = q[len(q) - 1][entries_orderby]
            after = int(time.mktime(after.timetuple()))
        page['title'] = '%s' % str(dt)[0:-3]
        page['robots'] = 'noindex'

    # Search/Query entries.
    search_enable = getattr(settings, 'SEARCH_ENABLE', False)
    search_engine = getattr(settings, 'SEARCH_ENGINE', 'sphinx')
    search_query = request.GET.get('s', '')

    if search_query != '' and search_enable:
        page['search'] = search_query
        page['title'] = 'Search Results for %s' % escape(search_query)
        page['subtitle'] = _('Your search for %s returned the following results.') % (
            '<b>' + escape(search_query) + '</b>')
        urlparams.append('s=' + search_query)
        sfs = {}
        if not authed and not friend:
            sfs['friends_only'] = False
        page_number = int(request.GET.get('page', 1))
        offset = (page_number - 1) * entries_on_page

        try:
            if search_engine == 'sphinx':
                select = "SELECT * FROM %s WHERE MATCH('%s')"
                if page['public']:
                    select += ' AND public=1'
                if 'friends_only' in sfs and sfs['friends_only'] == False:
                    select += ' AND friends_only=0'
                select += ' LIMIT 1000'

                cursor = connections['sphinx'].cursor()
                cursor.execute(select % (settings.SPHINX_INDEX_NAME,
                                         search_query))
                res = __dictfetchall(cursor)
                uids = [ent['id'] for ent in res]
                entries = entries.filter(id__in=uids).select_related()
            else:  # db search
                if page['public']:
                    sfs['service__public'] = True
                sfs['content__icontains'] = search_query
                entries = entries.filter(**sfs).select_related()

            limit = offset + entries_on_page
            if offset >= entries_on_page:
                page['prevpage'] = page_number - 1
            if limit < entries.count():
                page['nextpage'] = page_number + 1

            entries = entries[offset:limit]
        except:
            entries = []

        start = False

    # If not search, then normal query.
    else:
        entries = entries.filter(**fs)[0:entries_on_page + 1].select_related()
        num = len(entries)

        if 'exactentry' in page and num:
            page['title'] = truncatewords(entries[0].title, 7)

        # Time-based pagination.
        if num > entries_on_page:
            start = entries[num - 1].__getattribute__(entries_orderby)
            start = int(time.mktime(start.timetuple()))
        else:
            start = False

        entries = entries[0:entries_on_page]

        if num:
            crymax = entries[0].date_published.year
            crymin = entries[len(entries) - 1].date_published.year
            if crymin != crymax:
                page['copyright_years'] = '%s-%s' % (crymin, crymax)
            else:
                page['copyright_years'] = crymin

    # Build URL params for links.
    if len(urlparams):
        urlparams = '?' + reduce(lambda x, y: six.text_type(x) + '&' +
                                 six.text_type(y), urlparams, '')[1:] + '&'
    else:
        urlparams = '?'

    if len(entries):
        page['updated'] = entries[0].date_published
    else:
        page['updated'] = datetime.datetime.utcnow()
    page['urlparams'] = urlparams
    page['start'] = start
    page['after'] = after

    if hasattr(settings, 'STREAM_TITLE'):
        page_title = settings.STREAM_TITLE
    else:
        page_title = None

    if hasattr(settings, 'STREAM_DESCRIPTION'):
        page['description'] = settings.STREAM_DESCRIPTION

    # Set page theme.
    page['themes'] = settings.THEMES
    page['themes_more'] = True if len(settings.THEMES) > 1 else False
    page['theme'] = common.get_theme(request)

    # Setup links.
    page['need_fbc'] = False
    for entry in entries:
        entry.only_for_friends = entry.friends_only

        if authed or friend:
            entry.friends_only = False
        elif entry.friends_only:
            page['need_fbc'] = True

        if not entry.friends_only:
            entry.gls_link = '%s/%s' % (urlresolvers.reverse('entry', args=[entry.id]),
                                        gls_slugify(truncatewords(entry.title, 7)))
        else:
            entry.gls_link = '%s/' % (
                urlresolvers.reverse('entry', args=[entry.id]))
            if 'title' in page:
                del page['title']

        entry.gls_absolute_link = '%s%s' % (page['site_url'], entry.gls_link)

    # Check single-entry URL
    if 'exactentry' in page:
        if len(entries):
            gls_link = entries[0].gls_link
            if gls_link != request.path:
                return HttpResponsePermanentRedirect(gls_link)
            page['canonical_link'] = urllib.parse.urljoin(
                settings.BASE_URL, gls_link)
        else:
            raise Http404

    if 'title' in page and page['title'] != '':
        if page_title:
            page['title'] += getattr(settings, 'STREAM_TITLE_SUFFIX',
                                     ' | ' + page_title)
    elif page_title:
        page['title'] = page_title

    # Pickup right output format and finish.
    format = request.GET.get('format', 'html')
    if format == 'atom':
        return render_to_response('stream.atom',
                                  {'entries': entries,
                                   'page': page},
                                  content_type='application/atom+xml')
    elif format == 'json':
        cb = request.GET.get('callback', False)
        return render_to_response('stream.json',
                                  {'entries': entries,
                                   'page': page,
                                   'callback': cb},
                                  content_type='application/json')
    elif format == 'html-pure' and request.is_ajax():
        # Check which entry is already favorite.
        if authed and page['ctx'] != 'favorites':
            ents = [entry.id for entry in entries]
            favs = Favorite.objects.filter(user__id=request.user.id,
                                           entry__id__in=ents)
            favs = [f.entry_id for f in favs]
            for entry in entries:
                if entry.id in favs:
                    entry.fav = True
                if entry.service.api in ('twitter', 'identica'):
                    entry.sms = True
        d = {
            'next': page['start'],
            'stream': strip_spaces_between_tags(
                render_to_string('stream-pure.html',
                                 {'entries': entries,
                                  'page': page,
                                  'authed': authed,
                                  'friend': friend})),
        }
        if 'nextpage' in page:
            d['next'] = page['nextpage']
        return HttpResponse(json.dumps(d), content_type='application/json')
    elif format != 'html':
        raise Http404
    else:
        # Check which entry is already favorite.
        if authed and page['ctx'] != 'favorites':
            ents = [entry.id for entry in entries]
            favs = Favorite.objects.filter(user__id=request.user.id,
                                           entry__id__in=ents)
            favs = [f.entry_id for f in favs]
            for entry in entries:
                if entry.id in favs:
                    entry.fav = True
                if entry.service.api in ('twitter', 'identica'):
                    entry.sms = True

        # Get lists.
        lists = List.objects.filter(
            user__id=request.user.id).order_by('name')

        # Get archives.
        if 'entry' in args:
            qs = {}
        else:
            qs = fs.copy()
            if year:
                del qs[entries_orderby + '__year']
            if month:
                del qs[entries_orderby + '__month']
            if day:
                del qs[entries_orderby + '__day']
        archs = Entry.objects.filter(**qs).dates('date_published',
                                                 'month', order='DESC')
        page['months12'] = [datetime.date(2010, x, 1) for x in range(1, 13)]

        # List available classes.
        fs = {}
        if not authed or page['ctx'] == 'public':
            fs['public'] = True
        _classes = Service.objects.filter (**fs).order_by ('id')\
            .values('api', 'cls')
        classes = {}
        for item in _classes:
            if item['cls'] not in classes:
                classes[item['cls']] = item
        classes = list(classes.values())

        accept_lang = request.META.get('HTTP_ACCEPT_LANGUAGE', '').split(',')
        for i, lang in enumerate(accept_lang):
            accept_lang[i] = lang.split(';')[0]
        page['lang'] = accept_lang[0]

        request.user.fb_username = request.session.get('fb_username', '')
        request.user.fb_profile_url = request.session.get(
            'fb_profile_url', '')

        res = render_to_response('stream.html',
                                 {'classes': classes,
                                  'entries': entries,
                                  'lists': lists,
                                  'archives': archs,
                                  'page': page,
                                  'authed': authed,
                                  'friend': friend,
                                  'has_search': search_enable,
                                  'is_secure': request.is_secure(),
                                  'user': request.user})
        res['X-XRDS-Location'] = request.build_absolute_uri(
            urlresolvers.reverse('glifestream.gauth.views.xrds'))
        return res