mirror of https://gitlab.com/bashrc2/epicyon
Left column share links to individual post
parent
dcf3dedd2d
commit
46985b4f0d
32
daemon.py
32
daemon.py
|
@ -147,6 +147,7 @@ from webapp_utils import getAvatarImageUrl
|
|||
from webapp_utils import htmlHashtagBlocked
|
||||
from webapp_utils import htmlFollowingList
|
||||
from webapp_utils import setBlogAddress
|
||||
from webapp_utils import htmlShowShare
|
||||
from webapp_calendar import htmlCalendarDeleteConfirm
|
||||
from webapp_calendar import htmlCalendar
|
||||
from webapp_about import htmlAbout
|
||||
|
@ -11254,6 +11255,37 @@ class PubServer(BaseHTTPRequestHandler):
|
|||
'person options done',
|
||||
'blog post 2 done')
|
||||
|
||||
# after selecting a shared item from the left column then show it
|
||||
if htmlGET and '?showshare=' in self.path:
|
||||
itemID = self.path.split('?showshare=')[1]
|
||||
usersPath = self.path.split('?showshare=')[0]
|
||||
itemID = urllib.parse.unquote_plus(itemID.strip())
|
||||
msg = \
|
||||
htmlShowShare(self.server.baseDir,
|
||||
self.server.domain, self.server.nickname,
|
||||
self.server.httpPrefix, self.server.domainFull,
|
||||
itemID, self.server.translate,
|
||||
self.server.sharedItemsFederatedDomains)
|
||||
if not msg:
|
||||
if callingDomain.endswith('.onion') and \
|
||||
self.server.onionDomain:
|
||||
actor = 'http://' + self.server.onionDomain + usersPath
|
||||
elif (callingDomain.endswith('.i2p') and
|
||||
self.server.i2pDomain):
|
||||
actor = 'http://' + self.server.i2pDomain + usersPath
|
||||
self._redirect_headers(actor + '/tlshares',
|
||||
cookie, callingDomain)
|
||||
return
|
||||
msg = msg.encode('utf-8')
|
||||
msglen = len(msg)
|
||||
self._set_headers('text/html', msglen,
|
||||
cookie, callingDomain)
|
||||
self._write(msg)
|
||||
self._benchmarkGETtimings(GETstartTime, GETtimings,
|
||||
'blog post 2 done',
|
||||
'htmlShowShare')
|
||||
return
|
||||
|
||||
# remove a shared item
|
||||
if htmlGET and '?rmshare=' in self.path:
|
||||
itemID = self.path.split('?rmshare=')[1]
|
||||
|
|
|
@ -53,9 +53,9 @@ def _getLeftColumnShares(baseDir: str,
|
|||
sharedesc = item['displayName']
|
||||
if '<' in sharedesc or '?' in sharedesc:
|
||||
continue
|
||||
contactActor = item['actor']
|
||||
shareLink = actor + '?replydm=sharedesc:' + \
|
||||
sharedesc.replace(' ', '_') + '?mention=' + contactActor
|
||||
shareId = item['shareId']
|
||||
# selecting this link calls htmlShowShare
|
||||
shareLink = actor + '?showshare=' + shareId
|
||||
linksList.append(sharedesc + ' ' + shareLink)
|
||||
ctr += 1
|
||||
if ctr >= maxSharesInLeftColumn:
|
||||
|
|
|
@ -25,7 +25,6 @@ from utils import firstParagraphFromString
|
|||
from utils import searchBoxPosts
|
||||
from utils import getAltPath
|
||||
from utils import acctDir
|
||||
from utils import isfloat
|
||||
from skills import noOfActorSkills
|
||||
from skills import getSkillsFromList
|
||||
from categories import getHashtagCategory
|
||||
|
@ -36,6 +35,7 @@ from webapp_utils import htmlHeaderWithExternalStyle
|
|||
from webapp_utils import htmlFooter
|
||||
from webapp_utils import getSearchBannerFile
|
||||
from webapp_utils import htmlPostSeparator
|
||||
from webapp_utils import htmlSearchResultShare
|
||||
from webapp_post import individualPostAsHtml
|
||||
from webapp_hashtagswarm import htmlHashTagSwarm
|
||||
|
||||
|
@ -120,60 +120,6 @@ def _matchSharedItem(searchStrLowerList: [],
|
|||
return False
|
||||
|
||||
|
||||
def _htmlSearchResultShare(sharedItem: {}, translate: {},
|
||||
httpPrefix: str, domainFull: str,
|
||||
contactNickname: str, name: str,
|
||||
actor: str) -> str:
|
||||
"""Returns the html for an individual shared item
|
||||
"""
|
||||
sharedItemsForm = '<div class="container">\n'
|
||||
sharedItemsForm += \
|
||||
'<p class="share-title">' + sharedItem['displayName'] + '</p>\n'
|
||||
if sharedItem.get('imageUrl'):
|
||||
sharedItemsForm += \
|
||||
'<a href="' + sharedItem['imageUrl'] + '">\n'
|
||||
sharedItemsForm += \
|
||||
'<img loading="lazy" src="' + sharedItem['imageUrl'] + \
|
||||
'" alt="Item image"></a>\n'
|
||||
sharedItemsForm += '<p>' + sharedItem['summary'] + '</p>\n<p>'
|
||||
if sharedItem.get('itemQty'):
|
||||
if sharedItem['itemQty'] > 1:
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Quantity'] + \
|
||||
':</b> ' + str(sharedItem['itemQty']) + '<br>'
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Type'] + ':</b> ' + sharedItem['itemType'] + '<br>'
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Category'] + ':</b> ' + \
|
||||
sharedItem['category'] + '<br>'
|
||||
if sharedItem.get('location'):
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Location'] + ':</b> ' + \
|
||||
sharedItem['location'] + '<br>'
|
||||
if sharedItem.get('itemPrice') and \
|
||||
sharedItem.get('itemCurrency'):
|
||||
if isfloat(sharedItem['itemPrice']):
|
||||
if float(sharedItem['itemPrice']) > 0:
|
||||
sharedItemsForm += \
|
||||
' <b>' + translate['Price'] + \
|
||||
':</b> ' + sharedItem['itemPrice'] + \
|
||||
' ' + sharedItem['itemCurrency']
|
||||
sharedItemsForm += '</p>\n'
|
||||
contactActor = \
|
||||
httpPrefix + '://' + domainFull + '/users/' + contactNickname
|
||||
sharedItemsForm += \
|
||||
'<p><a href="' + actor + '?replydm=sharedesc:' + \
|
||||
sharedItem['displayName'] + '?mention=' + contactActor + \
|
||||
'"><button class="button">' + translate['Contact'] + '</button></a>\n'
|
||||
if actor.endswith('/users/' + contactNickname):
|
||||
sharedItemsForm += \
|
||||
' <a href="' + actor + '?rmshare=' + \
|
||||
name + '"><button class="button">' + \
|
||||
translate['Remove'] + '</button></a>\n'
|
||||
sharedItemsForm += '</p></div>\n'
|
||||
return sharedItemsForm
|
||||
|
||||
|
||||
def _htmlSearchResultSharePage(actor: str, domainFull: str,
|
||||
callingDomain: str, pageNumber: int,
|
||||
searchStrLower: str, translate: {},
|
||||
|
@ -227,10 +173,10 @@ def _htmlSharesResult(sharesJson: {}, pageNumber: int, resultsPerPage: int,
|
|||
if currPage == pageNumber:
|
||||
# show individual search result
|
||||
sharedItemsForm += \
|
||||
_htmlSearchResultShare(sharedItem, translate,
|
||||
httpPrefix, domainFull,
|
||||
contactNickname,
|
||||
name, actor)
|
||||
htmlSearchResultShare(sharedItem, translate,
|
||||
httpPrefix, domainFull,
|
||||
contactNickname,
|
||||
name, actor)
|
||||
if not resultsExist and currPage > 1:
|
||||
# show the previous page button
|
||||
sharedItemsForm += \
|
||||
|
|
119
webapp_utils.py
119
webapp_utils.py
|
@ -18,6 +18,8 @@ from utils import loadJson
|
|||
from utils import getCachedPostFilename
|
||||
from utils import getConfigParam
|
||||
from utils import acctDir
|
||||
from utils import getNicknameFromActor
|
||||
from utils import isfloat
|
||||
from cache import storePersonInCache
|
||||
from content import addHtmlTags
|
||||
from content import replaceEmojiFromTags
|
||||
|
@ -1249,3 +1251,120 @@ def editTextArea(label: str, name: str, value: str = "",
|
|||
text += 'spellcheck="' + str(spellcheck).lower() + '">'
|
||||
text += value + '</textarea>\n'
|
||||
return text
|
||||
|
||||
|
||||
def htmlSearchResultShare(sharedItem: {}, translate: {},
|
||||
httpPrefix: str, domainFull: str,
|
||||
contactNickname: str, name: str,
|
||||
actor: str) -> str:
|
||||
"""Returns the html for an individual shared item
|
||||
"""
|
||||
sharedItemsForm = '<div class="container">\n'
|
||||
sharedItemsForm += \
|
||||
'<p class="share-title">' + sharedItem['displayName'] + '</p>\n'
|
||||
if sharedItem.get('imageUrl'):
|
||||
sharedItemsForm += \
|
||||
'<a href="' + sharedItem['imageUrl'] + '">\n'
|
||||
sharedItemsForm += \
|
||||
'<img loading="lazy" src="' + sharedItem['imageUrl'] + \
|
||||
'" alt="Item image"></a>\n'
|
||||
sharedItemsForm += '<p>' + sharedItem['summary'] + '</p>\n<p>'
|
||||
if sharedItem.get('itemQty'):
|
||||
if sharedItem['itemQty'] > 1:
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Quantity'] + \
|
||||
':</b> ' + str(sharedItem['itemQty']) + '<br>'
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Type'] + ':</b> ' + sharedItem['itemType'] + '<br>'
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Category'] + ':</b> ' + \
|
||||
sharedItem['category'] + '<br>'
|
||||
if sharedItem.get('location'):
|
||||
sharedItemsForm += \
|
||||
'<b>' + translate['Location'] + ':</b> ' + \
|
||||
sharedItem['location'] + '<br>'
|
||||
if sharedItem.get('itemPrice') and \
|
||||
sharedItem.get('itemCurrency'):
|
||||
if isfloat(sharedItem['itemPrice']):
|
||||
if float(sharedItem['itemPrice']) > 0:
|
||||
sharedItemsForm += \
|
||||
' <b>' + translate['Price'] + \
|
||||
':</b> ' + sharedItem['itemPrice'] + \
|
||||
' ' + sharedItem['itemCurrency']
|
||||
sharedItemsForm += '</p>\n'
|
||||
contactActor = \
|
||||
httpPrefix + '://' + domainFull + '/users/' + contactNickname
|
||||
sharedItemsForm += \
|
||||
'<p><a href="' + actor + '?replydm=sharedesc:' + \
|
||||
sharedItem['displayName'] + '?mention=' + contactActor + \
|
||||
'"><button class="button">' + translate['Contact'] + '</button></a>\n'
|
||||
if actor.endswith('/users/' + contactNickname):
|
||||
sharedItemsForm += \
|
||||
' <a href="' + actor + '?rmshare=' + \
|
||||
name + '"><button class="button">' + \
|
||||
translate['Remove'] + '</button></a>\n'
|
||||
sharedItemsForm += '</p></div>\n'
|
||||
return sharedItemsForm
|
||||
|
||||
|
||||
def htmlShowShare(baseDir: str, domain: str, nickname: str,
|
||||
httpPrefix: str, domainFull: str,
|
||||
itemID: str, translate: {},
|
||||
sharedItemsFederatedDomains: []) -> str:
|
||||
"""Shows an individual shared item after selecting it from the left column
|
||||
"""
|
||||
sharesJson = None
|
||||
|
||||
shareUrl = itemID.replace('___', '://').replace('--', '/')
|
||||
contactNickname = getNicknameFromActor(shareUrl)
|
||||
if not contactNickname:
|
||||
return None
|
||||
|
||||
if '://' + domainFull + '/' in shareUrl:
|
||||
# shared item on this instance
|
||||
sharesFilename = \
|
||||
acctDir(baseDir, contactNickname, domain) + '/shares.json'
|
||||
if not os.path.isfile(sharesFilename):
|
||||
return None
|
||||
sharesJson = loadJson(sharesFilename)
|
||||
else:
|
||||
# federated shared item
|
||||
catalogsDir = baseDir + '/cache/catalogs'
|
||||
if not os.path.isdir(catalogsDir):
|
||||
return None
|
||||
for subdir, dirs, files in os.walk(catalogsDir):
|
||||
for f in files:
|
||||
if '#' in f:
|
||||
continue
|
||||
if not f.endswith('.shares.json'):
|
||||
continue
|
||||
federatedDomain = f.split('.')[0]
|
||||
if federatedDomain not in sharedItemsFederatedDomains:
|
||||
continue
|
||||
sharesFilename = catalogsDir + '/' + f
|
||||
sharesJson = loadJson(sharesFilename)
|
||||
if not sharesJson:
|
||||
continue
|
||||
if sharesJson.get(itemID):
|
||||
break
|
||||
break
|
||||
|
||||
if not sharesJson:
|
||||
return None
|
||||
if not sharesJson.get(itemID):
|
||||
return None
|
||||
sharedItem = sharesJson[itemID]
|
||||
actor = httpPrefix + '://' + domainFull + '/users/' + nickname
|
||||
shareStr = \
|
||||
htmlSearchResultShare(sharedItem, translate, httpPrefix,
|
||||
domainFull, contactNickname, itemID,
|
||||
actor)
|
||||
|
||||
cssFilename = baseDir + '/epicyon-profile.css'
|
||||
if os.path.isfile(baseDir + '/epicyon.css'):
|
||||
cssFilename = baseDir + '/epicyon.css'
|
||||
instanceTitle = \
|
||||
getConfigParam(baseDir, 'instanceTitle')
|
||||
|
||||
return htmlHeaderWithExternalStyle(cssFilename, instanceTitle) + \
|
||||
shareStr + htmlFooter()
|
||||
|
|
Loading…
Reference in New Issue