Added basic photo uploader in wall posts. Description is not supported
This commit is contained in:
parent
c7874759b1
commit
64b4b5573a
18
src/controller/attach.py
Normal file
18
src/controller/attach.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
import widgetUtils
|
||||||
|
from wxUI.dialogs import attach as gui
|
||||||
|
|
||||||
|
class attach(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.attachments = list()
|
||||||
|
self.dialog = gui.attachDialog()
|
||||||
|
widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||||
|
self.dialog.get_response()
|
||||||
|
|
||||||
|
def upload_image(self, *args, **kwargs):
|
||||||
|
image, description = self.dialog.get_image()
|
||||||
|
if image != None:
|
||||||
|
self.attachments.append({"type": "photo", "file": image, "description": os.path.basename(image)})
|
||||||
|
info = [_(u"Photo"), os.path.basename(image)]
|
||||||
|
self.dialog.attachments.insert_item(False, *info)
|
@ -11,6 +11,7 @@ from pubsub import pub
|
|||||||
from sessionmanager import session
|
from sessionmanager import session
|
||||||
from mysc.thread_utils import call_threaded
|
from mysc.thread_utils import call_threaded
|
||||||
from wxUI import commonMessages
|
from wxUI import commonMessages
|
||||||
|
from vk import upload
|
||||||
|
|
||||||
class baseBuffer(object):
|
class baseBuffer(object):
|
||||||
""" a basic representation of a buffer. Other buffers should be derived from this class"""
|
""" a basic representation of a buffer. Other buffers should be derived from this class"""
|
||||||
@ -63,9 +64,14 @@ class baseBuffer(object):
|
|||||||
def post(self, *args, **kwargs):
|
def post(self, *args, **kwargs):
|
||||||
p = messages.post(title=_(u"Write your post"), caption="", text="")
|
p = messages.post(title=_(u"Write your post"), caption="", text="")
|
||||||
if p.message.get_response() == widgetUtils.OK:
|
if p.message.get_response() == widgetUtils.OK:
|
||||||
|
call_threaded(self.do_last, p=p)
|
||||||
|
|
||||||
|
def do_last(self, p):
|
||||||
msg = p.message.get_text().encode("utf-8")
|
msg = p.message.get_text().encode("utf-8")
|
||||||
privacy_opts = p.get_privacy_options()
|
privacy_opts = p.get_privacy_options()
|
||||||
attachments = ""
|
attachments = ""
|
||||||
|
if hasattr(p, "attachments"):
|
||||||
|
attachments = self.upload_attachments(p.attachments)
|
||||||
urls = utils.find_urls_in_text(msg)
|
urls = utils.find_urls_in_text(msg)
|
||||||
if len(urls) != 0:
|
if len(urls) != 0:
|
||||||
if len(attachments) == 0: attachments = urls[0]
|
if len(attachments) == 0: attachments = urls[0]
|
||||||
@ -75,6 +81,21 @@ class baseBuffer(object):
|
|||||||
pub.sendMessage("posted", buffer=self.name)
|
pub.sendMessage("posted", buffer=self.name)
|
||||||
p.message.Destroy()
|
p.message.Destroy()
|
||||||
|
|
||||||
|
def upload_attachments(self, attachments):
|
||||||
|
# To do: Check the caption and description fields for this kind of attachments.
|
||||||
|
local_attachments = ""
|
||||||
|
uploader = upload.VkUpload(self.session.vk.client)
|
||||||
|
for i in attachments:
|
||||||
|
if i["type"] == "photo":
|
||||||
|
photos = i["file"]
|
||||||
|
description = i["description"]
|
||||||
|
r = uploader.photo_wall(photos, caption=description)
|
||||||
|
id = r[0]["id"]
|
||||||
|
owner_id = r[0]["owner_id"]
|
||||||
|
# self.session.vk.client.photos.edit(photo_id=id, owner_id=owner_id, caption=description)
|
||||||
|
local_attachments += "photo{0}_{1},".format(owner_id, id)
|
||||||
|
return local_attachments
|
||||||
|
|
||||||
def connect_events(self):
|
def connect_events(self):
|
||||||
widgetUtils.connect_event(self.tab.post, widgetUtils.BUTTON_PRESSED, self.post)
|
widgetUtils.connect_event(self.tab.post, widgetUtils.BUTTON_PRESSED, self.post)
|
||||||
widgetUtils.connect_event(self.tab.list.list, widgetUtils.KEYPRESS, self.get_event)
|
widgetUtils.connect_event(self.tab.list.list, widgetUtils.KEYPRESS, self.get_event)
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
|
import attach
|
||||||
from wxUI.dialogs import message
|
from wxUI.dialogs import message
|
||||||
from extra import SpellChecker, translator
|
from extra import SpellChecker, translator
|
||||||
|
|
||||||
@ -13,8 +14,9 @@ class post(object):
|
|||||||
self.message.set_title(title)
|
self.message.set_title(title)
|
||||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||||
self.image = None
|
self.images = []
|
||||||
# widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
if hasattr(self.message, "attach"):
|
||||||
|
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.show_attach_dialog)
|
||||||
|
|
||||||
def get_privacy_options(self):
|
def get_privacy_options(self):
|
||||||
p = self.message.get("privacy")
|
p = self.message.get("privacy")
|
||||||
@ -43,28 +45,10 @@ class post(object):
|
|||||||
self.message.set_text(checker.fixed_text)
|
self.message.set_text(checker.fixed_text)
|
||||||
checker.clean()
|
checker.clean()
|
||||||
|
|
||||||
# def attach(self, *args, **kwargs):
|
def show_attach_dialog(self, *args, **kwargs):
|
||||||
# def completed_callback():
|
a = attach.attach()
|
||||||
# url = dlg.uploaderFunction.get_url()
|
if len(a.attachments) != 0:
|
||||||
# pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
self.attachments = a.attachments
|
||||||
# dlg.uploaderDialog.destroy()
|
|
||||||
# if url != 0:
|
|
||||||
# self.message.set_text(self.message.get_text()+url+" #audio")
|
|
||||||
# else:
|
|
||||||
# output.speak(_(u"Unable to upload the audio"))
|
|
||||||
# dlg.cleanup()
|
|
||||||
# dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
|
||||||
|
|
||||||
def upload_image(self, *args, **kwargs):
|
|
||||||
if self.message.get("upload_image") == _(u"Discard image"):
|
|
||||||
del self.image
|
|
||||||
self.image = None
|
|
||||||
output.speak(_(u"Discarded"))
|
|
||||||
self.message.set("upload_image", _(u"Upload a picture"))
|
|
||||||
else:
|
|
||||||
self.image = self.message.get_image()
|
|
||||||
if self.image != None:
|
|
||||||
self.message.set("upload_image", _(u"Discard image"))
|
|
||||||
|
|
||||||
class comment(post):
|
class comment(post):
|
||||||
def __init__(self, title, caption, text):
|
def __init__(self, title, caption, text):
|
||||||
|
@ -78,7 +78,7 @@ class VkUpload(object):
|
|||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def photo_wall(self, photos, user_id=None, group_id=None):
|
def photo_wall(self, photos, user_id=None, group_id=None, caption="No description"):
|
||||||
""" Загрузка изображений на стену пользователя или в группу
|
""" Загрузка изображений на стену пользователя или в группу
|
||||||
|
|
||||||
:param photos: список путей к изображениям, либо путь к изображению
|
:param photos: список путей к изображениям, либо путь к изображению
|
||||||
@ -93,7 +93,6 @@ class VkUpload(object):
|
|||||||
elif group_id:
|
elif group_id:
|
||||||
values['group_id'] = group_id
|
values['group_id'] = group_id
|
||||||
response = self.vk.photos.getWallUploadServer(**values)
|
response = self.vk.photos.getWallUploadServer(**values)
|
||||||
|
|
||||||
url = response['upload_url']
|
url = response['upload_url']
|
||||||
photos_files = open_photos(photos)
|
photos_files = open_photos(photos)
|
||||||
response = self.session.post(url, files=photos_files)
|
response = self.session.post(url, files=photos_files)
|
||||||
|
43
src/wxUI/dialogs/attach.py
Normal file
43
src/wxUI/dialogs/attach.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import wx
|
||||||
|
import widgetUtils
|
||||||
|
|
||||||
|
class attachDialog(widgetUtils.BaseDialog):
|
||||||
|
def __init__(self):
|
||||||
|
super(attachDialog, self).__init__(None, title=_(u"Add an attachment"))
|
||||||
|
panel = wx.Panel(self)
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
lbl1 = wx.StaticText(panel, wx.NewId(), _(u"Attachments"))
|
||||||
|
self.attachments = widgetUtils.list(panel, _(u"Type"), _(u"Title"), style=wx.LC_REPORT)
|
||||||
|
box = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
box.Add(lbl1, 0, wx.ALL, 5)
|
||||||
|
box.Add(self.attachments.list, 0, wx.ALL, 5)
|
||||||
|
sizer.Add(box, 0, wx.ALL, 5)
|
||||||
|
static = wx.StaticBox(panel, label=_(u"Add attachments"))
|
||||||
|
self.photo = wx.Button(panel, wx.NewId(), _(u"&Photo"))
|
||||||
|
btnsizer = wx.StaticBoxSizer(static, wx.HORIZONTAL)
|
||||||
|
btnsizer.Add(self.photo, 0, wx.ALL, 5)
|
||||||
|
sizer.Add(btnsizer, 0, wx.ALL, 5)
|
||||||
|
ok = wx.Button(panel, wx.ID_OK)
|
||||||
|
ok.SetDefault()
|
||||||
|
cancelBtn = wx.Button(panel, wx.ID_CANCEL)
|
||||||
|
btnSizer = wx.BoxSizer()
|
||||||
|
btnSizer.Add(ok, 0, wx.ALL, 5)
|
||||||
|
btnSizer.Add(cancelBtn, 0, wx.ALL, 5)
|
||||||
|
sizer.Add(btnSizer, 0, wx.ALL, 5)
|
||||||
|
panel.SetSizer(sizer)
|
||||||
|
self.SetClientSize(sizer.CalcMin())
|
||||||
|
|
||||||
|
def get_image(self):
|
||||||
|
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||||
|
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||||
|
return None
|
||||||
|
dsc = ""
|
||||||
|
return (openFileDialog.GetPath(), dsc)
|
||||||
|
|
||||||
|
def ask_description(self):
|
||||||
|
dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description"), defaultValue="")
|
||||||
|
dlg.ShowModal()
|
||||||
|
result = dlg.GetValue()
|
||||||
|
dlg.Destroy()
|
||||||
|
return result
|
@ -58,15 +58,14 @@ class post(textMessage):
|
|||||||
self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
|
self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
|
||||||
self.create_privacy_box()
|
self.create_privacy_box()
|
||||||
self.mainBox.Add(self.privacyBox, 0, wx.ALL, 5)
|
self.mainBox.Add(self.privacyBox, 0, wx.ALL, 5)
|
||||||
self.upload_image = wx.Button(self.panel, -1, _(u"Upload a &picture"), size=wx.DefaultSize)
|
self.attach = wx.Button(self.panel, -1, _(u"Attach"), size=wx.DefaultSize)
|
||||||
self.upload_image.Enable(False)
|
|
||||||
self.spellcheck = wx.Button(self.panel, -1, _("Spelling &correction"), size=wx.DefaultSize)
|
self.spellcheck = wx.Button(self.panel, -1, _("Spelling &correction"), size=wx.DefaultSize)
|
||||||
self.translateButton = wx.Button(self.panel, -1, _(u"&Translate message"), size=wx.DefaultSize)
|
self.translateButton = wx.Button(self.panel, -1, _(u"&Translate message"), size=wx.DefaultSize)
|
||||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
||||||
self.okButton.SetDefault()
|
self.okButton.SetDefault()
|
||||||
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
||||||
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
|
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10)
|
self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10)
|
||||||
self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10)
|
self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10)
|
||||||
self.buttonsBox1.Add(self.translateButton, 0, wx.ALL, 10)
|
self.buttonsBox1.Add(self.translateButton, 0, wx.ALL, 10)
|
||||||
self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10)
|
self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10)
|
||||||
@ -86,11 +85,6 @@ class post(textMessage):
|
|||||||
self.createControls(message, title, text)
|
self.createControls(message, title, text)
|
||||||
self.SetClientSize(self.mainBox.CalcMin())
|
self.SetClientSize(self.mainBox.CalcMin())
|
||||||
|
|
||||||
def get_image(self):
|
|
||||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
|
||||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
|
||||||
return None
|
|
||||||
return openFileDialog.GetPath()
|
|
||||||
|
|
||||||
class comment(textMessage):
|
class comment(textMessage):
|
||||||
def createControls(self, title, message, text):
|
def createControls(self, title, message, text):
|
||||||
|
@ -52,3 +52,9 @@ class toolsMenu(wx.Menu):
|
|||||||
self.AppendItem(self.translate)
|
self.AppendItem(self.translate)
|
||||||
self.CheckSpelling = wx.MenuItem(self, -1, _(u"Check Spelling"))
|
self.CheckSpelling = wx.MenuItem(self, -1, _(u"Check Spelling"))
|
||||||
self.AppendItem(self.CheckSpelling)
|
self.AppendItem(self.CheckSpelling)
|
||||||
|
|
||||||
|
class attachMenu(wx.Menu):
|
||||||
|
def __init__(self):
|
||||||
|
super(attachMenu, self).__init__()
|
||||||
|
self.photo = wx.MenuItem(self, wx.NewId(), _(u"Picture"))
|
||||||
|
self.AppendItem(self.photo)
|
||||||
|
Loading…
Reference in New Issue
Block a user