diff --git a/cms/promoters.py b/cms/promoters.py
new file mode 100644
index 0000000..c7d5755
--- /dev/null
+++ b/cms/promoters.py
@@ -0,0 +1,99 @@
+import abc
+import os
+
+import requests
+
+from cms.models import Article
+
+
+class PromoteError(Exception):
+ pass
+
+
+class Promoter(abc.ABC):
+ def __init__(self, article: Article):
+ self.article = article
+
+ def promote(self):
+ raise NotImplementedError
+
+
+class TelegramPromoter(Promoter):
+ def promote(self):
+ bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
+ channel_id = os.getenv('TELEGRAM_CHAT_ID')
+
+ long_text = f'{self.article.body}\n{self.article.link}'
+
+ send_message_url = f'https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={channel_id}&text={long_text}'
+
+ response = requests.get(send_message_url)
+ result = response.json()
+ if not result['ok']:
+ raise PromoteError('Похоже, нас послали доделывать приложение :-(')
+
+
+class VkontaktePromoter(Promoter):
+ def promote(self):
+ vk_login = os.getenv('VK_LOGIN')
+ vk_password = os.getenv('VK_PASSWORD')
+ vk_owner_id = os.getenv('VK_OWNER_ID')
+
+ import vk_api
+ session = vk_api.VkApi(login=vk_login,
+ password=vk_password)
+ session.auth()
+ api = session.get_api()
+
+ try:
+ api.wall.post(owner_id=vk_owner_id,
+ message=self.article.body,
+ attachments=self.article.link)
+ except vk_api.VkApiError as exc:
+ raise PromoteError(exc)
+
+
+class OdnoklassnikiPromoter(Promoter):
+ def promote(self):
+ from json import JSONEncoder
+ import ok_api
+
+ ok_access_token = os.getenv('OK_ACCESS_TOKEN')
+ ok_application_key = os.getenv('OK_APPLICATION_KEY')
+ ok_application_secret_key = os.getenv('OK_APPLICATION_SECRET_KEY')
+
+ session = ok_api.OkApi(access_token=ok_access_token,
+ application_key=ok_application_key,
+ application_secret_key=ok_application_secret_key)
+ attachments = {
+ 'media': [
+ {
+ 'type': 'text',
+ 'text': self.article.body,
+ },
+ {
+ 'type': 'link',
+ 'url': self.article.link,
+ },
+ ]
+ }
+ encoded_attachments = JSONEncoder().encode(attachments)
+ try:
+ session.mediatopic.post(type='GROUP_THEME',
+ gid='70000001426867',
+ attachment=encoded_attachments)
+ except ok_api.OkApiException as exc:
+ raise PromoteError(exc)
+
+
+class Marketer:
+ def __init__(self, article: Article):
+ self.promoters = [
+ TelegramPromoter(article),
+ VkontaktePromoter(article),
+ OdnoklassnikiPromoter(article),
+ ]
+
+ def promote(self):
+ for promoter in self.promoters:
+ promoter.promote()
diff --git a/cms/templates/articles/created.html b/cms/templates/articles/created.html
deleted file mode 100644
index 8d53679..0000000
--- a/cms/templates/articles/created.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% extends 'base.html' %}
-{% block content %}
-
- Статья продвинута успешно!
-
-
- Продвиньте новую статью
-
-{% endblock content %}
\ No newline at end of file
diff --git a/cms/views.py b/cms/views.py
index d0a0837..a213f78 100644
--- a/cms/views.py
+++ b/cms/views.py
@@ -1,7 +1,3 @@
-import os
-from json import JSONEncoder
-
-import requests
from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
@@ -11,76 +7,28 @@ from django.shortcuts import render
from django.urls import reverse
from django.views import View
+from cms import promoters
from cms.forms import ArticleForm, UserForm
from cms.models import Article
class ArticleView(LoginRequiredMixin, View):
- def _promote_to_telegram(self, article: Article):
- bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
- channel_id = os.getenv('TELEGRAM_CHAT_ID')
-
- long_text = f'{article.body}\n{article.link}'
-
- send_message_url = f'https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={channel_id}&text={long_text}'
-
- response = requests.get(send_message_url)
- result = response.json()
- if result['ok']:
- print('Мы послали сообщение, ура!')
- else:
- print('Похоже, нас послали доделывать приложение :-(')
-
- def _promote_to_vk(self, article: Article):
- import vk_api
- vk_login = os.getenv('VK_LOGIN')
- vk_password = os.getenv('VK_PASSWORD')
- vk_owner_id = os.getenv('VK_OWNER_ID')
-
- session = vk_api.VkApi(login=vk_login,
- password=vk_password)
- session.auth()
- api = session.get_api()
-
- api.wall.post(owner_id=vk_owner_id,
- message=article.body,
- attachments=article.link)
-
- def _promote_to_ok(self, article: Article):
- import ok_api
-
- ok_access_token = os.getenv('OK_ACCESS_TOKEN')
- ok_application_key = os.getenv('OK_APPLICATION_KEY')
- ok_application_secret_key = os.getenv('OK_APPLICATION_SECRET_KEY')
-
- session = ok_api.OkApi(access_token=ok_access_token,
- application_key=ok_application_key,
- application_secret_key=ok_application_secret_key)
- attachments = {
- 'media': [
- {
- 'type': 'text',
- 'text': article.body,
- },
- {
- 'type': 'link',
- 'url': article.link,
- },
- ]
- }
- encoded_attachments = JSONEncoder().encode(attachments)
- session.mediatopic.post(type='GROUP_THEME',
- gid='70000001426867',
- attachment=encoded_attachments)
-
def post(self, request: HttpRequest):
post_data = request.POST
article = Article.objects.create(body=post_data['body'],
link=post_data['link'])
- self._promote_to_telegram(article)
- self._promote_to_ok(article)
- self._promote_to_vk(article)
- return render(request, template_name='articles/created.html')
+ marketer = promoters.Marketer(article)
+ try:
+ marketer.promote()
+ message_type = messages.SUCCESS
+ message_text = 'Продвижение статьи прошло успешно'
+ except promoters.PromoteError as exc:
+ message_type = messages.ERROR
+ message_text = 'Произошла ошибка: %s' % str(exc)
+ messages.add_message(request=request,
+ level=message_type,
+ message=message_text)
+ return HttpResponseRedirect(reverse('new-article'))
@login_required