__filename__ = "webapp_column_left.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "1.2.0"
__maintainer__ = "Bob Mottram"
__email__ = "bob@libreserver.org"
__status__ = "Production"
__module_group__ = "Web Interface Columns"
import os
from utils import getConfigParam
from utils import getNicknameFromActor
from utils import isEditor
from utils import removeDomainPort
from utils import localActorUrl
from webapp_utils import sharesTimelineJson
from webapp_utils import htmlPostSeparator
from webapp_utils import getLeftImageFile
from webapp_utils import headerButtonsFrontScreen
from webapp_utils import htmlHeaderWithExternalStyle
from webapp_utils import htmlFooter
from webapp_utils import getBannerFile
from shares import shareCategoryIcon
def _linksExist(baseDir: str) -> bool:
"""Returns true if links have been created
"""
linksFilename = baseDir + '/accounts/links.txt'
return os.path.isfile(linksFilename)
def _getLeftColumnShares(baseDir: str,
httpPrefix: str, domain: str, domainFull: str,
nickname: str,
maxSharesInLeftColumn: int,
translate: {},
sharedItemsFederatedDomains: []) -> []:
"""get any shares and turn them into the left column links format
"""
pageNumber = 1
actor = localActorUrl(httpPrefix, nickname, domainFull)
# NOTE: this could potentially be slow if the number of federated
# shared items is large
sharesJson, lastPage = \
sharesTimelineJson(actor, pageNumber, maxSharesInLeftColumn,
baseDir, domain, nickname, maxSharesInLeftColumn,
sharedItemsFederatedDomains, 'shares')
if not sharesJson:
return []
linksList = []
ctr = 0
for published, item in sharesJson.items():
sharedesc = item['displayName']
if '<' in sharedesc or '?' in sharedesc:
continue
shareId = item['shareId']
# selecting this link calls htmlShowShare
shareLink = actor + '?showshare=' + shareId
if item.get('category'):
shareLink += '?category=' + item['category']
shareCategory = shareCategoryIcon(item['category'])
linksList.append(shareCategory + sharedesc + ' ' + shareLink)
ctr += 1
if ctr >= maxSharesInLeftColumn:
break
if linksList:
linksList = ['* ' + translate['Shares']] + linksList
return linksList
def _getLeftColumnWanted(baseDir: str,
httpPrefix: str, domain: str, domainFull: str,
nickname: str,
maxSharesInLeftColumn: int,
translate: {},
sharedItemsFederatedDomains: []) -> []:
"""get any wanted items and turn them into the left column links format
"""
pageNumber = 1
actor = localActorUrl(httpPrefix, nickname, domainFull)
# NOTE: this could potentially be slow if the number of federated
# wanted items is large
sharesJson, lastPage = \
sharesTimelineJson(actor, pageNumber, maxSharesInLeftColumn,
baseDir, domain, nickname, maxSharesInLeftColumn,
sharedItemsFederatedDomains, 'wanted')
if not sharesJson:
return []
linksList = []
ctr = 0
for published, item in sharesJson.items():
sharedesc = item['displayName']
if '<' in sharedesc or ';' in sharedesc:
continue
shareId = item['shareId']
# selecting this link calls htmlShowShare
shareLink = actor + '?showwanted=' + shareId
linksList.append(sharedesc + ' ' + shareLink)
ctr += 1
if ctr >= maxSharesInLeftColumn:
break
if linksList:
linksList = ['* ' + translate['Wanted']] + linksList
return linksList
def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str,
httpPrefix: str, translate: {},
editor: bool,
showBackButton: bool, timelinePath: str,
rssIconAtTop: bool, showHeaderImage: bool,
frontPage: bool, theme: str,
accessKeys: {},
sharedItemsFederatedDomains: []) -> str:
"""Returns html content for the left column
"""
htmlStr = ''
separatorStr = htmlPostSeparator(baseDir, 'left')
domain = removeDomainPort(domainFull)
editImageClass = ''
if showHeaderImage:
leftImageFile, leftColumnImageFilename = \
getLeftImageFile(baseDir, nickname, domain, theme)
# show the image at the top of the column
editImageClass = 'leftColEdit'
if os.path.isfile(leftColumnImageFilename):
editImageClass = 'leftColEditImage'
htmlStr += \
'\n
\n \n' + \
'
\n'
if showBackButton:
htmlStr += \
'
' + \
'\n'
if (editor or rssIconAtTop) and not showHeaderImage:
htmlStr += '
'
if editImageClass == 'leftColEdit':
htmlStr += '\n
\n'
htmlStr += '
\n'
if editor:
# show the edit icon
htmlStr += \
' ' + \
'\n'
# RSS icon
if nickname != 'news':
# rss feed for this account
rssUrl = httpPrefix + '://' + domainFull + \
'/blog/' + nickname + '/rss.xml'
else:
# rss feed for all accounts on the instance
rssUrl = httpPrefix + '://' + domainFull + '/blog/rss.xml'
if not frontPage:
rssTitle = translate['RSS feed for your blog']
else:
rssTitle = translate['RSS feed for this site']
rssIconStr = \
' \n'
if rssIconAtTop:
htmlStr += rssIconStr
htmlStr += '
\n'
if editImageClass == 'leftColEdit':
htmlStr += '
\n'
if (editor or rssIconAtTop) and not showHeaderImage:
htmlStr += '
'
# if showHeaderImage:
# htmlStr += ' '
# flag used not to show the first separator
firstSeparatorAdded = False
linksFilename = baseDir + '/accounts/links.txt'
linksFileContainsEntries = False
linksList = None
if os.path.isfile(linksFilename):
with open(linksFilename, 'r') as f:
linksList = f.readlines()
if not frontPage:
# show a number of shares
maxSharesInLeftColumn = 3
sharesList = \
_getLeftColumnShares(baseDir,
httpPrefix, domain, domainFull, nickname,
maxSharesInLeftColumn, translate,
sharedItemsFederatedDomains)
if linksList and sharesList:
linksList = sharesList + linksList
wantedList = \
_getLeftColumnWanted(baseDir,
httpPrefix, domain, domainFull, nickname,
maxSharesInLeftColumn, translate,
sharedItemsFederatedDomains)
if linksList and wantedList:
linksList = wantedList + linksList
newTabStr = ' target="_blank" rel="nofollow noopener noreferrer"'
if linksList:
htmlStr += '\n'
if firstSeparatorAdded:
htmlStr += separatorStr
htmlStr += \
'