You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.5 KiB

from io import BytesIO
import requests
import yaml
from django.views.generic import TemplateView
from djconfig import config
from jconfig.base import BaseConfig
from python_anticaptcha import AnticaptchaClient, ImageToTextTask
from yaml.parser import ParserError
from cabinet.utils import CabinetViewMixin
from feeds.forms import FeedForm, FeedsAppConfigForm
from config.utils import get_config_form
from feeds.models import Feed
class BaseFeedConfigView(CabinetViewMixin, TemplateView):
template_name = 'cabinet/feeds/feed_form.html'
context_object_name = 'feed'
def get_queryset(self):
return Feed.objects.filter(owner=self.request.user)
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return self.render_to_response(self.get_context_data())
def post(self, request, *args, **kwargs):
self.object = self.get_object()
feed_form, config_form = self.get_forms()
if feed_form.is_valid() and config_form.is_valid():
return self.form_valid(feed_form, config_form)
else:
context = self.get_context_data(forms=(feed_form, config_form))
return self.render_to_response(context)
def get_forms(self):
feed = self.get_object()
data = self.request.POST if self.request.method == 'POST' else None
return FeedForm(data=data, instance=feed), \
get_config_form(self.get_content_type().model_class())(data=data, instance=feed.config if feed else None)
def get_context_data(self, forms=None, **kwargs):
ctx = super(BaseFeedConfigView, self).get_context_data(**kwargs)
ctx['feed_form'], ctx['config_form'] = self.get_forms() if forms is None else forms
ctx['feed_module'] = self.get_content_type().model_class()
return ctx
class DatabaseConfig(BaseConfig):
__slots__ = ()
def load(self, **kwargs):
config._reload_maybe()
try:
settings = yaml.load(config.vk_auth)
except (ParserError, AttributeError):
settings = {}
settings.setdefault(self.section_name, {})
return settings
def save(self):
form = FeedsAppConfigForm(data={'vk_auth': yaml.dump(self._settings)})
form.is_valid()
form.save()
def captcha_handler(captcha):
client = AnticaptchaClient(config.anticaptcha_token)
job = client.createTask(ImageToTextTask(BytesIO(requests.get(captcha.get_url()).content)))
job.join()
return captcha.try_again(job.get_captcha_text())