diff --git a/README.md b/README.md index 17f0440..1d4c60d 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,9 @@ Then to really get the most out of the repo, you can access the template mailer. Some of the pages functionality:

- Founders can upload their own companies as per normal, using pagelane's sweet form
-- You can curate and upload new, white logos on the backend
+- You can curate and upload new, white logos on the backend (/dashboard/logo), only once you upload a new logo will the startup be displayed on your page
+- To repace a logo, simply upload a new logo, the old one will be overwritten
+- Only click "Delete" on /dashboard/logo if you want to completely remove the startup, i.e. its spam
- All data is accessible from the dashboard or through the google cloud console
- you can collect mailers through the early adopter mailing list form

@@ -85,7 +87,10 @@ I think you have about 1GB of free storage on GAE, if you upload so many logos t You can read more about the google cloud platform at http://cloud.google.com

-..........if all this is too much for you look me up on slack and if I have a minute I'll help you out. +..........if all this is too much for you look me up (@emile - Foundedx) on slack and if I have a minute I'll help you out. +
+
+ diff --git a/foundedin/main.py b/foundedin/main.py index e29bfda..9dfcd03 100755 --- a/foundedin/main.py +++ b/foundedin/main.py @@ -103,16 +103,37 @@ def tweet(status): #serves the homepage class HomePage(MainHandler): def get(self): + curs = Cursor(urlsafe=self.request.get('cursor')) year = datetime.datetime.now().year settings = model.Settings.query().get() mail = model.MandrillApi.query().get() tw = model.TwitterApi.query().get() - startups = model.Startup.query(model.Startup.approved == True).order(model.Startup.q1).fetch(500) + features = model.Feature.query(model.Feature.front_page == True, model.Feature.live == True).fetch() + + pages = model.StaticPage.query().fetch() + + #startups = model.Startup.query(model.Startup.approved == True).order(model.Startup.q1).fetch(500) + + startups, next_curs, more = model.Startup.query(model.Startup.approved == True).order(model.Startup.q1).fetch_page(500, start_cursor=curs) + if more and next_curs: + next_curs = next_curs.urlsafe() + else: + next_curs = False if not settings: self.response.out.write("If you are the admin for this page please navigate to /dashboard and complete the page setup") else: - self.render("index.html", startups=startups, year=year, settings=settings, mail=mail, tw=tw) + self.render("index.html", startups=startups, year=year, settings=settings, mail=mail, tw=tw, next_curs=next_curs, features=features, pages=pages) + +class ViewLogos(MainHandler): + def get(self): + year = datetime.datetime.now().year + settings = model.Settings.query().get() + mail = model.MandrillApi.query().get() + tw = model.TwitterApi.query().get() + startups = model.Startup.query(model.Startup.approved == True).order(model.Startup.q1).fetch(500) + + self.render("admin.html", startups=startups, year=year, settings=settings, mail=mail, tw=tw) # add a startup... completed by prospective startups class AddStartup(MainHandler): @@ -137,6 +158,7 @@ def post(self): try: utils.send_notification_mail(q1) except: + logging.error("no notification sent") pass #serve the admin page @@ -158,7 +180,20 @@ def get(self): mail = model.MandrillApi.query().get() tw = model.TwitterApi.query().get() year = datetime.datetime.now().year - self.render("about.html", year=year, settings=settings, mail=mail, tw=tw) + pages = model.StaticPage.query().fetch() + self.render("about.html", year=year, settings=settings, mail=mail, tw=tw, pages=pages) + +class StaticPage(MainHandler): + def get(self, page_url): + settings = model.Settings.query().get() + mail = model.MandrillApi.query().get() + tw = model.TwitterApi.query().get() + year = datetime.datetime.now().year + + page = model.StaticPage.query(model.StaticPage.page_url == page_url).get() + pages = model.StaticPage.query().fetch() + self.render("static_page.html", page=page, pages=pages, settings=settings, tw=tw, mail=mail) + class Dashboard(MainHandler): def get(self): @@ -173,6 +208,7 @@ def post(self): bg_color = self.request.get("bg_color") link_color = self.request.get("link_color") logo_highlight_color = self.request.get("logo_highlight_color") + nav_color = self.request.get("nav_color") intro_html = self.request.get("intro_html") in_common_1 = self.request.get("in_common_1") in_common_2 = self.request.get("in_common_2") @@ -190,8 +226,11 @@ def post(self): seo_description = self.request.get("seo_description") seo_keywords = self.request.get("seo_keywords") share_url = self.request.get("share_url") + css = self.request.get("css") + ga = self.request.get("ga") tw_handle = self.request.get("tw_handle") + auto_tweet = self.request.get("auto_tweet") tw_short_url = self.request.get("tw_short_url") tw_consumer_key = self.request.get("tw_consumer_key") tw_consumer_secret = self.request.get("tw_consumer_secret") @@ -219,6 +258,7 @@ def post(self): bg_color=bg_color, link_color=link_color, logo_highlight_color=logo_highlight_color, + nav_color=nav_color, intro_html=intro_html, in_common_1=in_common_1, in_common_2=in_common_2, @@ -232,6 +272,8 @@ def post(self): logo_credit=logo_credit, logo_credit_name=logo_credit_name, about_html=about_html, + css=css, + ga=ga, ) settings.put() else: @@ -244,6 +286,7 @@ def post(self): settings.bg_color=bg_color settings.link_color=link_color settings.logo_highlight_color=logo_highlight_color + settings.nav_color=nav_color settings.intro_html=intro_html settings.in_common_1=in_common_1 settings.in_common_2=in_common_2 @@ -258,6 +301,8 @@ def post(self): settings.logo_credit=logo_credit settings.logo_credit_name=logo_credit_name settings.about_html=about_html + settings.css=css + settings.ga=ga settings.put() tw = model.TwitterApi.query().get() @@ -270,6 +315,7 @@ def post(self): tw_consumer_secret=tw_consumer_secret, tw_access_token_key=tw_access_token_key, tw_access_token_secret=tw_access_token_secret, + auto_tweet=auto_tweet, ) tw.put() else: @@ -279,6 +325,7 @@ def post(self): tw.tw_consumer_secret=tw_consumer_secret tw.tw_access_token_key=tw_access_token_key tw.tw_access_token_secret=tw_access_token_secret + tw.auto_tweet=auto_tweet tw.put() mail = model.MandrillApi.query().get() @@ -318,6 +365,34 @@ def get(self): startups = model.Startup.query().order(-model.Startup.q1).fetch(500) self.render("dashboard_logo.html", startups=startups) +class DashboardStaticPage(MainHandler): + def get(self): + + pages = model.StaticPage.query().fetch() + + self.render("dashboard_static_page.html", pages=pages) + + def post(self): + html = self.request.get("html") + title = self.request.get("title") + page_url = self.request.get("page_url") + pid = self.request.get("pid") + + page_url = utils.check_alphanumeric(page_url) + + if pid: + page = model.StaticPage.get_by_id(int(pid)) + page.html = html + page.title = title + page.page_url = page_url + page.put() + else: + page = model.StaticPage(html=html, page_url=page_url, title=title) + page.put() + + self.redirect("/dashboard/static_page") + + class DashboardFeaturedArticles(MainHandler): def get(self): articles = model.Feature.query().fetch() @@ -337,6 +412,22 @@ def post(self): founder = self.request.get_all("founder") podcast = self.request.get("podcast") startup_id = self.request.get("startup_id") + front_page = self.request.get("display_on_front_page") + feature_external = self.request.get("feature_external") + + logging.error(".... front page") + logging.error(front_page) + + if front_page == "yes": + front_page = True + else: + front_page = False + + if feature_external == "yes": + feature_external=True + else: + feature_external = False + startup = model.Startup.get_by_id(int(startup_id)) founder_list = [] @@ -359,7 +450,7 @@ def post(self): } founder_list.append(obj) - f = model.Feature(description=description, founder=founder_list, podcast=podcast, startup=startup.key) + f = model.Feature(description=description, founder=founder_list, podcast=podcast, startup=startup.key, front_page=front_page, feature_external=feature_external) f.put() self.redirect("/dashboard/featured_articles") @@ -377,6 +468,17 @@ def post(self, feature_id): podcast = self.request.get("podcast") startup_id = self.request.get("startup_id") startup = model.Startup.get_by_id(int(startup_id)) + front_page = self.request.get("display_on_front_page") + feature_external = self.request.get("feature_external") + + if front_page == "yes": + front_page = True + else: + front_page = False + if feature_external == "yes": + feature_external=True + else: + feature_external = False feature_id = feature_id @@ -405,6 +507,8 @@ def post(self, feature_id): feature.founder = founder_list feature.podcast = podcast feature.startup = startup.key + feature.front_page = front_page + feature.feature_external = feature_external feature.put() self.redirect("/dashboard/featured_articles") @@ -505,6 +609,9 @@ def get(self): class EarlyAdopter(MainHandler): def post(self): ea = self.request.get("ea") + settings = model.Settings.query().get() + mail = model.MandrillApi.query().get() + tw = model.TwitterApi.query().get() existing_email = model.EarlyAdopter.query(model.EarlyAdopter.ea == ea).get() @@ -515,7 +622,7 @@ def post(self): ea_id = ea.key.id() t = jinja_env.get_template("mailer.html") - html = t.render(ea_id=ea_id) + html = t.render(ea_id=ea_id, settings=settings, tw=tw, mail=mail) utils.send_mail(ea.ea, ea_id, html) @@ -549,8 +656,6 @@ class Upload(blobstore_handlers.BlobstoreUploadHandler): def post(self, startup_id): upload_files = self.get_uploads('new_logo') - logging.error(upload_files) - blob_info = upload_files[0] blob_key = blob_info.key() @@ -571,29 +676,43 @@ def post(self, startup_id): year = datetime.datetime.now().year - if startup.q4: - if int(startup.q2) == year: - status = "New #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) - #status = "Check out the hot new SA #startup, %s, via @foundedinsa bit.ly/1ugm5eG" % startup.q4 - else: - status = "Featured #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) + + auto_tweet = tw.auto_tweet + if not auto_tweet: + status = "New #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) else: - if int(startup.q2) == year: - status = "New #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) + status = auto_tweet.replace("*MYHANDLE*", tw.tw_handle) + if startup.q4: + status = status.replace("*SUHANDLE*", startup.q4) + else: + status = status.replace("*SUHANDLE*", '') + + if tw.tw_short_url: + status = status.replace("*SHORTURL*", tw.tw_short_url) else: - status = "Featured #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) + if tw.tw_handle: + status = status.replace("*SHORTURL*", tw.tw_handle) + else: + status = status.replace("*SHORTURL*", '') + status = status.replace("*SUNAME*", startup.q1) + + # if startup.q4: + # if int(startup.q2) == year: + # status = "New #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) + # else: + # status = "Featured #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) + # else: + # if int(startup.q2) == year: + # status = "New #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) + # else: + # status = "Featured #startup on %s: %s via %s" % ( tw.tw_short_url, startup.q4, tw.tw_handle ) try: tweet(status) - #pass except tweepy.TweepError as e: logging.error(e.response.status) - #status = "Checkout the hot new SA startup, %s" % startup.q4 - - #tweet(serving_url, status) - self.redirect("/dashboard/logo") class UploadFeature(blobstore_handlers.BlobstoreUploadHandler): @@ -798,15 +917,19 @@ def get(self): ('/', HomePage), ('/add_startup', AddStartup), ('/admin', Admin), + ('/view_logos', ViewLogos), ('/archive', Archive), #('/tweet/(\w+)', TweetStartup), ('/about', About), + ('/page/(\w+)', StaticPage), ('/dashboard', Dashboard), ('/dashboard/startups', DashboardStartups), ('/dashboard/logo', DashboardLogo), ('/dashboard/feature', DashboardFeature), ('/dashboard/feature_edit/(\w+)', DashboardFeatureEdit), ('/dashboard/featured_articles', DashboardFeaturedArticles), + ('/dashboard/static_page', DashboardStaticPage), + ('/feature_golive/(\w+)', FeatureGoLive), ('/feature_deactivate/(\w+)', FeatureDeactivate), ('/feature/(\w+)', Feature), diff --git a/foundedin/main.pyc b/foundedin/main.pyc index beb7fe9..402df03 100644 Binary files a/foundedin/main.pyc and b/foundedin/main.pyc differ diff --git a/foundedin/model.py b/foundedin/model.py index 16593c4..708a0c5 100755 --- a/foundedin/model.py +++ b/foundedin/model.py @@ -23,16 +23,19 @@ class EarlyAdopter(ndb.Model): class Feature(ndb.Model): startup = ndb.KeyProperty(Startup) - description = ndb.StringProperty() + description = ndb.TextProperty() founder = ndb.JsonProperty(repeated=True) podcast = ndb.StringProperty() live = ndb.BooleanProperty(default=False) blob_key = ndb.BlobKeyProperty() new_logo = ndb.StringProperty() + front_page = ndb.BooleanProperty() + feature_external = ndb.BooleanProperty() created = ndb.DateTimeProperty(auto_now_add=True) class TwitterApi(ndb.Model): tw_handle = ndb.StringProperty() + auto_tweet = ndb.StringProperty() tw_short_url = ndb.StringProperty() tw_consumer_key = ndb.StringProperty() tw_consumer_secret = ndb.StringProperty() @@ -56,6 +59,7 @@ class Settings(ndb.Model): svg_html = ndb.TextProperty() bg_color = ndb.StringProperty() link_color = ndb.StringProperty() + nav_color = ndb.StringProperty() logo_highlight_color = ndb.StringProperty() intro_html = ndb.TextProperty() in_common_1 = ndb.StringProperty() @@ -70,8 +74,13 @@ class Settings(ndb.Model): logo_credit = ndb.StringProperty() logo_credit_name = ndb.StringProperty() about_html = ndb.TextProperty() + css = ndb.TextProperty() + ga = ndb.TextProperty() - +class StaticPage(ndb.Model): + page_url = ndb.StringProperty() + title = ndb.StringProperty() + html = ndb.TextProperty() diff --git a/foundedin/model.pyc b/foundedin/model.pyc index 4e1962e..22d2483 100644 Binary files a/foundedin/model.pyc and b/foundedin/model.pyc differ diff --git a/foundedin/static/css/component.css b/foundedin/static/css/component.css index 916b5b4..3ee0ce5 100755 --- a/foundedin/static/css/component.css +++ b/foundedin/static/css/component.css @@ -101,4 +101,187 @@ .cbp-rfgrid li { width: 100%; } -} \ No newline at end of file +} + + + + + +a.menu-icon { + /*position: absolute;*/ + float: right; + border: 0; + background: none; + color: #FFF; + font-size: 1.8em; + padding: 10px 20px 0 0; + cursor: pointer; + text-decoration: none; +} + + +/* General styles for all menus */ +.cbp-spmenu { + background: #47a3da; + position: fixed; +} + +.cbp-spmenu h3 { + color: #afdefa; + font-size: 1.9em; + padding: 20px; + margin: 0; + font-weight: 300; + background: #0d77b6; +} + +.cbp-spmenu a { + display: block; + color: #fff; + font-size: 1.1em; + font-weight: 300; + border: 0 !important; + border-radius: 0 !important; +} + +.cbp-spmenu a:hover { + background: #258ecd; +} + +.cbp-spmenu a:active { + background: #afdefa; + color: #47a3da; +} + +/* Orientation-dependent styles for the content of the menu */ +.cbp-spmenu-vertical { + width: 240px; + height: 100%; + top: 0; + z-index: 1000; + overflow-y: scroll; +} + +.cbp-spmenu-vertical a { + border: 0; + padding: 1em; +} + +.cbp-spmenu-horizontal { + width: 100%; + height: 150px; + left: 0; + z-index: 1000; + overflow: hidden; +} + +.cbp-spmenu-horizontal h3 { + height: 100%; + width: 20%; + float: left; +} + +.cbp-spmenu-horizontal a { + float: left; + width: 20%; + padding: 0.8em; + border: 0; +} + +/* Vertical menu that slides from the left or right */ +.cbp-spmenu-left { + left: -240px; +} + +.cbp-spmenu-right { + right: -240px; +} + +.cbp-spmenu-left.menu-open { + left: 0px; +} + +.cbp-spmenu-right.menu-open { + right: 0px; +} + +/* Horizontal menu that slides from the top or bottom */ + +.cbp-spmenu-top { + top: -150px; +} + +.cbp-spmenu-bottom { + bottom: -150px; +} + +.cbp-spmenu-top.menu-open { + top: 0px; +} + +.cbp-spmenu-bottom.menu-open { + bottom: 0px; +} + +/* Push classes applied to the body */ +.push-body { + overflow-x: hidden; + position: relative; + left: 0; +} + +.push-body-toright { + left: 240px; +} + +.push-body-toleft { + left: -240px; +} + +/* Transitions */ +.cbp-spmenu, +.push-body { + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + transition: all 0.3s ease; +} + +/* Example media queries */ +@media screen and (max-width: 55.1875em) { + .cbp-spmenu-horizontal { + font-size: 75%; + height: 110px; + } + + .cbp-spmenu-top { + top: -110px; + } + + .cbp-spmenu-bottom { + bottom: -110px; + } +} + +@media screen and (max-height: 26.375em) { + .cbp-spmenu-vertical { + font-size: 90%; + width: 190px; + } + + .cbp-spmenu-left, + .push-body-toleft { + left: -190px; + } + + .cbp-spmenu-right { + right: -190px; + } + + .push-body-toright { + left: 190px; + } +} + + + + diff --git a/foundedin/static/css/default.css b/foundedin/static/css/default.css index 75c402b..74c8a40 100755 --- a/foundedin/static/css/default.css +++ b/foundedin/static/css/default.css @@ -426,6 +426,38 @@ a.no-link { transform: translate(-50%, -50%); } +/* Featured line */ + +.container .featured-line { + border-top: solid 0.1em #FFF; + width: 90%; + margin: 0 auto; + opacity: 0.7; + filter: alpha(opacity=70); + text-align: center; +} +.container .featured-title { + position: relative; + border: solid 0.1em #FFF; + font-size: 0.8em; + padding: 8px; + top: -1.4em; + text-align: center; + white-space: nowrap; + display: inline-block; + text-transform: uppercase; + text-align: center; + -webkit-border-radius: 0.250em; + -moz-border-radius: 0.250em; + border-radius: 0.250em; +} + +/* - - - - - CUSTOM STATIC PAGE - - - - -*/ + +.custom_page{ + padding: 2em; + min-height: 100%; +} diff --git a/foundedin/static/images/banner.png b/foundedin/static/images/banner.png new file mode 100644 index 0000000..e9526df Binary files /dev/null and b/foundedin/static/images/banner.png differ diff --git a/foundedin/static/js/jPushMenu.js b/foundedin/static/js/jPushMenu.js new file mode 100755 index 0000000..ea1df7b --- /dev/null +++ b/foundedin/static/js/jPushMenu.js @@ -0,0 +1,94 @@ +/*! + * jPushMenu.js + * 1.1.1 + * @author: takien + * http://takien.com + * Original version (pure JS) is created by Mary Lou http://tympanus.net/ + */ + +(function($) { + $.fn.jPushMenu = function(customOptions) { + var o = $.extend({}, $.fn.jPushMenu.defaultOptions, customOptions); + + $('body').addClass(o.pushBodyClass); + + // Add class to toggler + $(this).addClass('jPushMenuBtn'); + + $(this).click(function(e) { + e.stopPropagation(); + + var target = '', + push_direction = ''; + + // Determine menu and push direction + if ($(this).is('.' + o.showLeftClass)) { + target = '.cbp-spmenu-left'; + push_direction = 'toright'; + } + else if ($(this).is('.' + o.showRightClass)) { + target = '.cbp-spmenu-right'; + push_direction = 'toleft'; + } + else if ($(this).is('.' + o.showTopClass)) { + target = '.cbp-spmenu-top'; + } + else if ($(this).is('.' + o.showBottomClass)) { + target = '.cbp-spmenu-bottom'; + } + + if (target == '') { + return; + } + + $(this).toggleClass(o.activeClass); + $(target).toggleClass(o.menuOpenClass); + + if ($(this).is('.' + o.pushBodyClass) && push_direction != '') { + $('body').toggleClass(o.pushBodyClass + '-' + push_direction); + } + + // Disable all other buttons + $('.jPushMenuBtn').not($(this)).toggleClass('disabled'); + + return; + }); + + var jPushMenu = { + close: function (o) { + $('.jPushMenuBtn,body,.cbp-spmenu') + .removeClass('disabled ' + o.activeClass + ' ' + o.menuOpenClass + ' ' + o.pushBodyClass + '-toleft ' + o.pushBodyClass + '-toright'); + } + } + + // Close menu on clicking outside menu + if (o.closeOnClickOutside) { + $(document).click(function() { + jPushMenu.close(o); + }); + } + + // Close menu on clicking menu link + if (o.closeOnClickLink) { + $('.cbp-spmenu a').on('click',function() { + jPushMenu.close(o); + }); + } + }; + + /* + * In case you want to customize class name, + * do not directly edit here, use function parameter when call jPushMenu. + */ + $.fn.jPushMenu.defaultOptions = { + pushBodyClass : 'push-body', + showLeftClass : 'menu-left', + showRightClass : 'menu-right', + showTopClass : 'menu-top', + showBottomClass : 'menu-bottom', + activeClass : 'menu-active', + menuOpenClass : 'menu-open', + closeOnClickOutside: true, + closeOnClickLink : true + }; +})(jQuery); diff --git a/foundedin/templates/about.html b/foundedin/templates/about.html index b7180d0..9ecf02c 100644 --- a/foundedin/templates/about.html +++ b/foundedin/templates/about.html @@ -9,6 +9,7 @@

About Founded in {{settings.name}}

{% endblock %} - +{% block features %} +{% endblock %} {% block companies %} {% endblock %} \ No newline at end of file diff --git a/foundedin/templates/admin.html b/foundedin/templates/admin.html index 259922d..a7f644e 100644 --- a/foundedin/templates/admin.html +++ b/foundedin/templates/admin.html @@ -15,31 +15,12 @@ {% block header %} -

Admin

diff --git a/foundedin/templates/dashboard_feature.html b/foundedin/templates/dashboard_feature.html index 740886d..0b03124 100644 --- a/foundedin/templates/dashboard_feature.html +++ b/foundedin/templates/dashboard_feature.html @@ -43,6 +43,15 @@

New Feature

+
+ + +
+
+ + +
+ diff --git a/foundedin/templates/dashboard_general.html b/foundedin/templates/dashboard_general.html index dffc508..fc4ad32 100644 --- a/foundedin/templates/dashboard_general.html +++ b/foundedin/templates/dashboard_general.html @@ -64,6 +64,15 @@

Page Styles

{% endif %} +
+ + {% if settings.nav_color %} + + {% else %} + + {% endif %} +
+

SEO

@@ -98,6 +107,17 @@

SEO

{% endif %}
+

Google Analytics

+ +
+ + {% if settings.ga %} + + {% else %} + + {% endif %} +
+

Front Page

@@ -235,6 +255,23 @@

TWITTER API (need to create a twitter app, activate read & write permissi {% endif %} + +
+ +

Type the text you would like to tweet everytime a new startup is added. Please ensure that the tweet does not exceed the normal Twitter character limit (take into consideration the dynamic content). The tweet will be triggered everytime you upload the white logo, please use the following placeholders for dynamic content:

+
    +
  • *MYHANDLE* = your twitter handle
  • +
  • *SUHANDLE* = twitter handle of the startup, if they have included a handle
  • +
  • *SHORTURL* = your shortened URL
  • +
  • *SUNAME* = the startup's name
  • +
+ {% if tw.auto_tweet %} + + {% else %} + + {% endif %} +
+
{% if tw.tw_consumer_key %} @@ -320,6 +357,16 @@

For the early adopter email

{% endif %}
+

Some custom CSS (not necessary)

+
+ + {% if settings.css %} + + {% else %} + + {% endif %} +
+ {% else %}

Page Name

@@ -331,21 +378,7 @@

Page Name

SVG Logo

-
@@ -363,6 +396,11 @@

Page Styles

+
+ + +
+

SEO

@@ -381,6 +419,11 @@

SEO

+
+ + +
+

Front Page

@@ -458,6 +501,19 @@

TWITTER API

+ +
+ +

Type the text you would like to tweet everytime a new startup is added. Please ensure that the tweet does not exceed the normal Twitter character limit (take into consideration the dynamic content). The tweet will be triggered everytime you upload the white logo, please use the following placeholders for dynamic content:

+
    +
  • *MYHANDLE* = your twitter handle
  • +
  • *SUHANDLE* = twitter handle of the startup, if they have included a handle
  • +
  • *SHORTURL* = your shortened URL
  • +
  • *SUNAME* = the startup's name
  • +
+ +
+
@@ -503,6 +559,12 @@

For the early adopter email

+

Some custom CSS (not necessary)

+
+ + +
+ {% endif %} diff --git a/foundedin/templates/dashboard_static_page.html b/foundedin/templates/dashboard_static_page.html new file mode 100644 index 0000000..9a9127c --- /dev/null +++ b/foundedin/templates/dashboard_static_page.html @@ -0,0 +1,73 @@ +{% extends "dashboard_base.html" %} + +{% block page_name %} + Static Pages +{% endblock %} + +{% block breadcrumbs %}Static Pages{% endblock %} + +{% block main %} +
+
+

New Page

+
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+
+ {% for p in pages %} +
+
+

{{p.title}}

+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + +
+
+
+
+ {% endfor %} +{% endblock %} + +{% block script %} +{% endblock %} + + + + + + diff --git a/foundedin/templates/edit_feature.html b/foundedin/templates/edit_feature.html index 014f868..6b5a251 100644 --- a/foundedin/templates/edit_feature.html +++ b/foundedin/templates/edit_feature.html @@ -58,6 +58,22 @@

Edit Feature

{% endfor %} +
+ + {% if feature.front_page %} + + {% else %} + + {% endif %} +
+
+ + {% if feature.feature_external %} + + {% else %} + + {% endif %} +
diff --git a/foundedin/templates/feature.html b/foundedin/templates/feature.html index 7b27a70..ab5cbf4 100644 --- a/foundedin/templates/feature.html +++ b/foundedin/templates/feature.html @@ -3,8 +3,9 @@ {% block style %} + + + {% block style %} @@ -56,7 +107,23 @@ - + + +
@@ -83,7 +150,43 @@

+ + {% block feature %} + {% if features %} +
+ +
+ + {% endif %} + {% endblock %} {% block companies %} +
+ +
    {% for s in startups %}
  • @@ -95,6 +198,9 @@

    {{s.q1}}

  • {% endfor %}
+ {% if next_curs %} + See more + {% endif %} {% endblock %} {% block join %}
@@ -170,22 +276,22 @@

Startups

Follow on {% if settings.follow_facebook %} -  Twitter +  Facebook  ·  {% endif %} {% if settings.follow_twitter %} -  Facebook +  Twitter  ·  {% endif %} {% if settings.follow_instagram %} -  Facebook +  Instagram  ·  {% endif %} {% if settings.follow_soundcloud %} -  Facebook +  SoundCloud  ·  {% endif %} @@ -202,8 +308,8 @@

Startups

-

Become an

-
early adopter +

Join our

+ Mailing List @@ -228,12 +334,6 @@

Become an

-

- Share your email address with us and become an early adopter, we'll contact you if there are any exciting opportunities that our startups offer. -

-

- We will only share your email address with startups we feel are trustworthy and can offer exciting opportunities to consumers, you will be able to unsubscribe at any time. -

@@ -256,13 +356,6 @@

Become an

{% endif %} {% endif %} - Foundedx @@ -274,6 +367,13 @@

Become an

+ + + - + {% if settings.ga %} + {{settings.ga|safe}} + {% endif %}