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 @@
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:
+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:
+- 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 @@
@@ -274,6 +367,13 @@