forked from indymedia/epicyon
				
			
		
			
				
	
	
		
			169 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
| __filename__ = "webapp_frontscreen.py"
 | |
| __author__ = "Bob Mottram"
 | |
| __license__ = "AGPL3+"
 | |
| __version__ = "1.1.0"
 | |
| __maintainer__ = "Bob Mottram"
 | |
| __email__ = "bob@freedombone.net"
 | |
| __status__ = "Production"
 | |
| 
 | |
| import os
 | |
| from utils import isSystemAccount
 | |
| from utils import getDomainFromActor
 | |
| from person import personBoxJson
 | |
| from webapp_utils import htmlHeaderWithExternalStyle
 | |
| from webapp_utils import htmlFooter
 | |
| from webapp_utils import getBannerFile
 | |
| from webapp_utils import htmlPostSeparator
 | |
| from webapp_utils import headerButtonsFrontScreen
 | |
| from webapp_column_left import getLeftColumnContent
 | |
| from webapp_column_right import getRightColumnContent
 | |
| from webapp_post import individualPostAsHtml
 | |
| 
 | |
| 
 | |
| def htmlFrontScreenPosts(recentPostsCache: {}, maxRecentPosts: int,
 | |
|                          translate: {},
 | |
|                          baseDir: str, httpPrefix: str,
 | |
|                          nickname: str, domain: str, port: int,
 | |
|                          session, wfRequest: {}, personCache: {},
 | |
|                          projectVersion: str,
 | |
|                          YTReplacementDomain: str,
 | |
|                          showPublishedDateOnly: bool) -> str:
 | |
|     """Shows posts on the front screen of a news instance
 | |
|     These should only be public blog posts from the features timeline
 | |
|     which is the blog timeline of the news actor
 | |
|     """
 | |
|     separatorStr = htmlPostSeparator(baseDir, None)
 | |
|     profileStr = ''
 | |
|     maxItems = 4
 | |
|     ctr = 0
 | |
|     currPage = 1
 | |
|     boxName = 'tlfeatures'
 | |
|     authorized = True
 | |
|     while ctr < maxItems and currPage < 4:
 | |
|         outboxFeed = \
 | |
|             personBoxJson({}, session, baseDir, domain, port,
 | |
|                           '/users/' + nickname + '/' + boxName +
 | |
|                           '?page=' + str(currPage),
 | |
|                           httpPrefix, 10, boxName,
 | |
|                           authorized, 0, False, 0)
 | |
|         if not outboxFeed:
 | |
|             break
 | |
|         if len(outboxFeed['orderedItems']) == 0:
 | |
|             break
 | |
|         for item in outboxFeed['orderedItems']:
 | |
|             if item['type'] == 'Create':
 | |
|                 postStr = \
 | |
|                     individualPostAsHtml(True, recentPostsCache,
 | |
|                                          maxRecentPosts,
 | |
|                                          translate, None,
 | |
|                                          baseDir, session, wfRequest,
 | |
|                                          personCache,
 | |
|                                          nickname, domain, port, item,
 | |
|                                          None, True, False,
 | |
|                                          httpPrefix, projectVersion, 'inbox',
 | |
|                                          YTReplacementDomain,
 | |
|                                          showPublishedDateOnly,
 | |
|                                          False, False, False, True, False)
 | |
|                 if postStr:
 | |
|                     profileStr += postStr + separatorStr
 | |
|                     ctr += 1
 | |
|                     if ctr >= maxItems:
 | |
|                         break
 | |
|         currPage += 1
 | |
|     return profileStr
 | |
| 
 | |
| 
 | |
| def htmlFrontScreen(rssIconAtTop: bool,
 | |
|                     cssCache: {}, iconsAsButtons: bool,
 | |
|                     defaultTimeline: str,
 | |
|                     recentPostsCache: {}, maxRecentPosts: int,
 | |
|                     translate: {}, projectVersion: str,
 | |
|                     baseDir: str, httpPrefix: str, authorized: bool,
 | |
|                     profileJson: {}, selected: str,
 | |
|                     session, wfRequest: {}, personCache: {},
 | |
|                     YTReplacementDomain: str,
 | |
|                     showPublishedDateOnly: bool,
 | |
|                     newswire: {}, theme: str, extraJson=None,
 | |
|                     pageNumber=None, maxItemsPerPage=None) -> str:
 | |
|     """Show the news instance front screen
 | |
|     """
 | |
|     nickname = profileJson['preferredUsername']
 | |
|     if not nickname:
 | |
|         return ""
 | |
|     if not isSystemAccount(nickname):
 | |
|         return ""
 | |
|     domain, port = getDomainFromActor(profileJson['id'])
 | |
|     if not domain:
 | |
|         return ""
 | |
|     domainFull = domain
 | |
|     if port:
 | |
|         domainFull = domain + ':' + str(port)
 | |
| 
 | |
|     loginButton = headerButtonsFrontScreen(translate, nickname,
 | |
|                                            'features', authorized,
 | |
|                                            iconsAsButtons)
 | |
| 
 | |
|     # If this is the news account then show a different banner
 | |
|     bannerFile, bannerFilename = \
 | |
|         getBannerFile(baseDir, nickname, domain, theme)
 | |
|     profileHeaderStr = \
 | |
|         '<img loading="lazy" class="timeline-banner" ' + \
 | |
|         'src="/users/' + nickname + '/' + bannerFile + '" />\n'
 | |
|     if loginButton:
 | |
|         profileHeaderStr += '<center>' + loginButton + '</center>\n'
 | |
| 
 | |
|     profileHeaderStr += '<table class="timeline">\n'
 | |
|     profileHeaderStr += '  <colgroup>\n'
 | |
|     profileHeaderStr += '    <col span="1" class="column-left">\n'
 | |
|     profileHeaderStr += '    <col span="1" class="column-center">\n'
 | |
|     profileHeaderStr += '    <col span="1" class="column-right">\n'
 | |
|     profileHeaderStr += '  </colgroup>\n'
 | |
|     profileHeaderStr += '  <tbody>\n'
 | |
|     profileHeaderStr += '    <tr>\n'
 | |
|     profileHeaderStr += '      <td valign="top" class="col-left">\n'
 | |
|     profileHeaderStr += \
 | |
|         getLeftColumnContent(baseDir, 'news', domainFull,
 | |
|                              httpPrefix, translate,
 | |
|                              False, False, None, rssIconAtTop, True,
 | |
|                              True, theme)
 | |
|     profileHeaderStr += '      </td>\n'
 | |
|     profileHeaderStr += '      <td valign="top" class="col-center">\n'
 | |
| 
 | |
|     profileStr = profileHeaderStr
 | |
| 
 | |
|     cssFilename = baseDir + '/epicyon-profile.css'
 | |
|     if os.path.isfile(baseDir + '/epicyon.css'):
 | |
|         cssFilename = baseDir + '/epicyon.css'
 | |
| 
 | |
|     licenseStr = ''
 | |
|     bannerFile, bannerFilename = \
 | |
|         getBannerFile(baseDir, nickname, domain, theme)
 | |
|     profileStr += \
 | |
|         htmlFrontScreenPosts(recentPostsCache, maxRecentPosts,
 | |
|                              translate,
 | |
|                              baseDir, httpPrefix,
 | |
|                              nickname, domain, port,
 | |
|                              session, wfRequest, personCache,
 | |
|                              projectVersion,
 | |
|                              YTReplacementDomain,
 | |
|                              showPublishedDateOnly) + licenseStr
 | |
| 
 | |
|     # Footer which is only used for system accounts
 | |
|     profileFooterStr = '      </td>\n'
 | |
|     profileFooterStr += '      <td valign="top" class="col-right">\n'
 | |
|     profileFooterStr += \
 | |
|         getRightColumnContent(baseDir, 'news', domainFull,
 | |
|                               httpPrefix, translate,
 | |
|                               False, False, newswire, False,
 | |
|                               False, None, False, False,
 | |
|                               False, True, authorized, True, theme)
 | |
|     profileFooterStr += '      </td>\n'
 | |
|     profileFooterStr += '  </tr>\n'
 | |
|     profileFooterStr += '  </tbody>\n'
 | |
|     profileFooterStr += '</table>\n'
 | |
| 
 | |
|     profileStr = \
 | |
|         htmlHeaderWithExternalStyle(cssFilename) + \
 | |
|         profileStr + profileFooterStr + htmlFooter()
 | |
|     return profileStr
 |