Fix views & update admin

This commit is contained in:
Sonny Bakker 2020-09-24 22:45:22 +02:00
parent 52d8c14abe
commit f21b626802
5 changed files with 70 additions and 19 deletions

View file

@ -11,8 +11,18 @@ class UserAdminForm(UserChangeForm):
class Meta: class Meta:
widgets = { widgets = {
"email": forms.EmailInput(attrs={"size": "50"}), "email": forms.EmailInput(attrs={"size": "50"}),
"reddit_access_token": forms.TextInput(attrs={"size": "90"}), "reddit_access_token": forms.PasswordInput(
"reddit_refresh_token": forms.TextInput(attrs={"size": "90"}), attrs={"size": "90"}, render_value=True
),
"reddit_refresh_token": forms.PasswordInput(
attrs={"size": "90"}, render_value=True
),
"twitter_oauth_token": forms.PasswordInput(
attrs={"size": "90"}, render_value=True
),
"twitter_oauth_token_secret": forms.PasswordInput(
attrs={"size": "90"}, render_value=True
),
} }
@ -34,6 +44,10 @@ class UserAdmin(DjangoUserAdmin):
_("Reddit settings"), _("Reddit settings"),
{"fields": ("reddit_access_token", "reddit_refresh_token")}, {"fields": ("reddit_access_token", "reddit_refresh_token")},
), ),
(
_("Twitter settings"),
{"fields": ("twitter_oauth_token", "twitter_oauth_token_secret")},
),
( (
_("Permission settings"), _("Permission settings"),
{"classes": ("collapse",), "fields": ("is_staff", "is_superuser")}, {"classes": ("collapse",), "fields": ("is_staff", "is_superuser")},

View file

@ -44,13 +44,25 @@
<div class="integrations"> <div class="integrations">
<h3 class="integrations__title">Twitter</h3> <h3 class="integrations__title">Twitter</h3>
<div class="integrations__controls"> <div class="integrations__controls">
<a class="link button button--twitter" href="#"> {% if twitter_request_url %}
<a class="link button button--twitter" href="{{ twitter_request_url }}">
{% trans "Authorize account" %} {% trans "Authorize account" %}
</a> </a>
{% else %}
<button class="button button--twitter button--disabled" disabled>
{% trans "Authorize account" %}
</button>
{% endif %}
{% if twitter_revoke_url %}
<a class="link button button--twitter" href="#"> <a class="link button button--twitter" href="#">
{% trans "Deauthorize account" %} {% trans "Deauthorize account" %}
</a> </a>
{% else %}
<button class="button button--twitter button--disabled" disabled>
{% trans "Deauthorize account" %}
</button>
{% endif %}
</div> </div>
</div> </div>
</section> </section>

View file

@ -20,6 +20,8 @@ from newsreader.accounts.views import (
RegistrationCompleteView, RegistrationCompleteView,
RegistrationView, RegistrationView,
SettingsView, SettingsView,
TwitterAuthRedirectView,
TwitterTemplateView,
) )
@ -84,6 +86,16 @@ urlpatterns = [
login_required(RedditRevokeRedirectView.as_view()), login_required(RedditRevokeRedirectView.as_view()),
name="reddit-revoke", name="reddit-revoke",
), ),
path(
"settings/integrations/twitter/request/",
login_required(TwitterAuthRedirectView.as_view()),
name="twitter-request",
),
path(
"settings/integrations/twitter/callback/",
login_required(TwitterTemplateView.as_view()),
name="twitter-template",
),
path( path(
"settings/integrations", "settings/integrations",
login_required(IntegrationsView.as_view()), login_required(IntegrationsView.as_view()),

View file

@ -4,6 +4,8 @@ from newsreader.accounts.views.integrations import (
RedditRevokeRedirectView, RedditRevokeRedirectView,
RedditTemplateView, RedditTemplateView,
RedditTokenRedirectView, RedditTokenRedirectView,
TwitterAuthRedirectView,
TwitterTemplateView,
) )
from newsreader.accounts.views.password import ( from newsreader.accounts.views.password import (
PasswordChangeView, PasswordChangeView,

View file

@ -37,6 +37,7 @@ class IntegrationsView(TemplateView):
return { return {
**super().get_context_data(**kwargs), **super().get_context_data(**kwargs),
**self.get_reddit_context(**kwargs), **self.get_reddit_context(**kwargs),
**self.get_twitter_context(**kwargs),
} }
def get_reddit_context(self, **kwargs): def get_reddit_context(self, **kwargs):
@ -66,6 +67,19 @@ class IntegrationsView(TemplateView):
), ),
} }
def get_twitter_context(self, **kwargs):
twitter_revoke_url = None
user = self.request.user
# TODO add revoke url
if user.twitter_oauth_token and user.twitter_oauth_token_secret:
twitter_revoke_url = "https://foo/bar"
return {
"twitter_request_url": reverse_lazy("accounts:twitter-request"),
"twitter_revoke_url": twitter_revoke_url,
}
class RedditTemplateView(TemplateView): class RedditTemplateView(TemplateView):
template_name = "accounts/views/reddit.html" template_name = "accounts/views/reddit.html"
@ -162,8 +176,6 @@ class RedditRevokeRedirectView(RedirectView):
return response return response
# TODO hookup url to urlconf
# TODO hookup url to integrations button
class TwitterAuthRedirectView(RedirectView): class TwitterAuthRedirectView(RedirectView):
url = reverse_lazy("accounts:integrations") url = reverse_lazy("accounts:integrations")
@ -182,8 +194,7 @@ class TwitterAuthRedirectView(RedirectView):
messages.error(request, _("Unable to retrieve initial Twitter token")) messages.error(request, _("Unable to retrieve initial Twitter token"))
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)
params = parse_qs(response.content) params = parse_qs(response.text)
request_oauth_token = params.get("oauth_token")[0] request_oauth_token = params.get("oauth_token")[0]
request_oauth_secret = params.get("oauth_token_secret")[0] request_oauth_secret = params.get("oauth_token_secret")[0]
@ -194,20 +205,20 @@ class TwitterAuthRedirectView(RedirectView):
} }
) )
request_params = urlencode({"oauth_token": request_oauth_secret}) request_params = urlencode({"oauth_token": request_oauth_token})
return redirect(f"{TWITTER_AUTH_URL}/?{request_params}") return redirect(f"{TWITTER_AUTH_URL}/?{request_params}")
# TODO hookup url # TODO remove cached tokens
class TwitterTemplateView(TemplateView): class TwitterTemplateView(TemplateView):
template_name = "accounts/views/twitter.html" template_name = "accounts/views/twitter.html"
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
denied = request.GET.get("denied", True) denied = request.GET.get("denied", False)
oauth_token = request.GET.get("oauth_token") oauth_token = request.GET.get("oauth_token")
request.GET.get("oauth_verifier") oauth_verifier = request.GET.get("oauth_verifier")
if denied: if denied:
return self.render_to_response( return self.render_to_response(
@ -231,7 +242,7 @@ class TwitterTemplateView(TemplateView):
cached_secret = cache.get(f"twitter-{request.user.email}-secret") cached_secret = cache.get(f"twitter-{request.user.email}-secret")
if not cached_token or not cached_token_secret: if not cached_token or not cached_secret:
return self.render_to_response( return self.render_to_response(
{ {
**context, **context,
@ -245,7 +256,7 @@ class TwitterTemplateView(TemplateView):
client_secret=settings.TWITTER_CONSUMER_SECRET, client_secret=settings.TWITTER_CONSUMER_SECRET,
resource_owner_key=cached_token, resource_owner_key=cached_token,
resource_owner_secret=cached_secret, resource_owner_secret=cached_secret,
verifier=oauth_token_secret, verifier=oauth_verifier,
) )
try: try:
@ -261,7 +272,7 @@ class TwitterTemplateView(TemplateView):
} }
) )
params = parse_qs(response.content) params = parse_qs(response.text)
oauth_token = params.get("oauth_token")[0] oauth_token = params.get("oauth_token")[0]
oauth_secret = params.get("oauth_token_secret")[0] oauth_secret = params.get("oauth_token_secret")[0]