def get(self):
		template = jinja_environment.get_template("cards/user-interaction.html")
		template_values = {}

		headers.set_cors_headers(self.response)

		self.response.out.write(template.render(template_values))
Exemple #2
0
	def get(self, country_code="us", entries="5"):
		template = jinja_environment.get_template("most-popular.html")

		cache_key = "ophan_list_{0}".format(country_code)

		ophan_list_data = memcache.get(cache_key)

		if not ophan_list_data:
			ophan_list_data = ophan.popular_by_country(country_code=country_code)
			memcache.set(cache_key, ophan_list_data, 60)

		content_list = []

		if ophan_list_data:
			ophan_list = json.loads(ophan_list_data)
			content_list = [content_api.content_id(result['url']) for result in ophan_list]
			content_list = [content_api.read(path, params={"show-fields" : "headline,thumbnail"}) for path in content_list]
			content_list = [json.loads(result) for result in content_list if result]
			content_list = [result["response"]["content"] for result in content_list if content_api.response_ok(result)]
			content_list = content_list[0:int(entries)]

		country_name_lookup = {
			"us" : "in the US",
			"au" : "in Australia",
		}

		data ={
			"most_popular" : content_list,
			"component_title" : "Most popular {0}".format(country_name_lookup.get(country_code, "")),
		}

		headers.set_cors_headers(self.response)
		self.response.out.write(template.render(data))
	def get(self):
		headers.set_cors_headers(self.response)
		
		template = jinja_environment.get_template("cards/article/bottom-front-promo.html")
		template_values = {
			'logo' : images.guardian_logo,
		}

		lookup_params = {
			'page-size' : '30',
			'show-fields' : 'headline,trailText',
			'show-elements' : 'image',
			'show-editors-picks' : 'true',
			'edition' : 'us',
			'tag' : 'type/article',
		}

		headline_cap = 3

		us_result = content_api.read('/', lookup_params)

		us_json = json.loads(us_result)

		#logging.info(us_json)

		if not us_json:
			webapp2.abort(404, 'Could not find data for US Front')

		latest_pieces = us_json.get('response', {}).get('editorsPicks', [])

		#logging.info(latest_pieces)

		template_values['latest'] = latest_pieces[:headline_cap]

		self.response.out.write(template.render(template_values))
	def get(self):
            client = memcache.Client()
            query_str = self.request.query_string
            key = None
            if query_str:
                key = make_key(query_str)
            logging.info(key)    
            if not key:
                key = 'all'
            logging.info(key)
            ophan_json = client.get(key)
            if not ophan_json:
                refresh_data(key)
                ophan_json = "[]"

            last_read = client.get(key + ".epoch_seconds")
            if last_read and not fresh(last_read):
                refresh_data(key)
            
            headers.json(self.response)
            headers.set_cache_headers(self.response, 60)
            headers.set_cors_headers(self.response)

            if 'view=html' in query_str:
                html = generate_html(ophan_json)
                if html is not None:
                    self.response.write(formats.jsonp(self.request, json.dumps({"html" : html})))
                else:
                    self.error(404)
                    self.response.out.write('404 page')    
            else:
                self.response.out.write(formats.jsonp(self.request, ophan_json))
	def get(self, entries="4"):
		template = jinja_environment.get_template("recipe-box.html")
		headers.set_cors_headers(self.response)

		last_60_days = date.today() - timedelta(days=60)

		query = {
			"tag" : "tone/recipes",
			"show-fields" : "headline,thumbnail",
			"page-size" : 50,
			"from-date" : last_60_days.isoformat(),
		}

		content = content_api.search(query)

		if not content:
			webapp2.abort(500, "Failed to read recipes list")

		content_data = json.loads(content)

		recipes = content_data.get("response", {}).get("results", [])

		recipes = [r for r in recipes if "thumbnail" in r.get("fields", {})]
		random.shuffle(recipes)

		data = {
			"recipes" : recipes[0:int(entries)],
		}


		self.response.out.write(template.render(data))
Exemple #6
0
	def post(self):
		selection = self.request.get("selection")
		selection = selection.lstrip()
		selection = selection.rstrip()

		path = self.request.get("path")

		today = datetime.date.today().isoformat()
		if selection and len(selection) <= 500:
			sha = hashlib.sha1(selection.encode('utf-8')).hexdigest()

			if path:
				CapturedSelection(text=selection, checksum=sha, path=path).put()
			else:
				CapturedSelection(text=selection, checksum=sha).put()

			text_key = ndb.Key("Text", sha)
			text_entity = text_key.get()

			if not text_entity:
				Text(id=sha, text=selection).put()

			count_key_id = today + "." + sha

			count_key = ndb.Key('Summary', count_key_id)

			count = count_key.get()

			if count:
				count.count = count.count + 1
				count.put()
			else:
				Summary(id=count_key_id, text=selection, checksum=sha, count=1, size=len(selection)).put()

		headers.set_cors_headers(self.response, host=CORS_HOST)
	def get(self):
		headers.set_cors_headers(self.response)
		
		template = jinja_environment.get_template("cards/contributor/footer.html")
		template_values = {
			'other_stories' : False,
		}

		if not 'profile-id' in self.request.params:
			webapp2.abort(400, 'No profile id supplied')

		profile_id = self.request.params['profile-id']

		logging.info(profile_id)

		contributor_json = content_api.read(profile_id, {'show-fields' : 'headline'})

		logging.info(contributor_json)

		if not contributor_json:
			webapp2.abort(404, 'Could not find data for profile id: {profile_id}'.format(profile_id=profile_id))

		contributor_data = json.loads(contributor_json)
		
		template_values['contributor'] = contributor_data.get('response', {}).get('tag', {})

		if 'other-stories' in self.request.params:
			search_results = contributor_data.get('response', {}).get('results', [])
			template_values['other_stories'] = search_results[:3]


		self.response.out.write(template.render(template_values))
	def get(self):
		headers.set_cors_headers(self.response)
		
		template = jinja_environment.get_template("cards/valenti.html")
		template_values = {}

		self.response.out.write(template.render(template_values))
Exemple #9
0
	def get(self, entries="5"):
		template = jinja_environment.get_template("most-popular.html")

		cache_key = "ophan_list_popular"

		ophan_list_data = memcache.get(cache_key)

		if not ophan_list_data:
			ophan_list_data = ophan.popular()
			memcache.set(cache_key, ophan_list_data, 60)

		content_list = []

		if ophan_list_data:
			ophan_list = json.loads(ophan_list_data)
			content_list = [content_api.content_id(result['url']) for result in ophan_list]
			content_list = [content_api.read(path, params={"show-fields" : "headline,thumbnail"}) for path in content_list]
			content_list = [json.loads(result) for result in content_list if result]
			content_list = [result["response"]["content"] for result in content_list if content_api.response_ok(result)]
			content_list = content_list[0:int(entries)]

		data ={
			"most_popular" : content_list,
			"component_title" : "Most popular",
		}

		headers.set_cors_headers(self.response)
		self.response.out.write(template.render(data))
Exemple #10
0
	def get(self):

		profile_path = self.request.get("profile_path", None)
		country = self.request.headers["X-AppEngine-Country"]

		cache_time = 10 * 60
		headers.json(self.response)
		host = "http://www.theguardian.com"
		if gae.is_development():
			host = "*"
		headers.set_cors_headers(self.response, host=host)

		if not profile_path:
			abort(400)

		headers.set_cache_headers(self.response, cache_time)

		key = ndb.Key(Contributor, profile_path)
		contributor = key.get()

		if not contributor:
			abort(404)

		data = {
			"personal" : contributor.twitter_handle,
			"brand" : "guardian",
		}

		if contributor.twitter_brand_handle:
			data['brand'] = contributor.twitter_brand_handle

		self.response.out.write(json.dumps(data))
Exemple #11
0
	def get(self):
		headers.set_cors_headers(self.response)
		headers.json(self.response)

		template = jinja_environment.get_template("js/user-interaction.js")
		template_values = {}

		self.response.out.write(template.render(template_values))
Exemple #12
0
	def get(self):
		template = jinja_environment.get_template("all-images-gallery.html")
		template_values = {}

		if "page-url" in self.request.params:
			template_values["images"] = all_images(self.request.params["page-url"])

		headers.set_cors_headers(self.response)
		self.response.out.write(template.render(template_values))
Exemple #13
0
	def get(self):
		template = jinja_environment.get_template("related-galleries.html")

		data = {"title" : "More galleries",}
		if "page-url" in self.request.params:
			data["galleries"] = related_galleries(self.request.params["page-url"], recent=True)[:4]

		headers.set_cors_headers(self.response)
		self.response.out.write(template.render(data))
Exemple #14
0
	def get(self, target='4'):
		template = jinja_environment.get_template("related-galleries.html")

		data = {"title" : "More galleries",}
		if "page-url" in self.request.params:
			data["galleries"] = related_galleries(self.request.params["page-url"])[:int(target)]
		else:
			abort(400, "No page url specified")

		headers.set_cors_headers(self.response)
		self.response.out.write(template.render(data))
Exemple #15
0
	def get(self, target='12'):
		template = jinja_environment.get_template("components/gallery-box.html")

		headers.set_cors_headers(self.response)

		data = {"title" : "More galleries",}
		if "page-url" in self.request.params:
			gallery_data = related_galleries(self.request.params["page-url"])

			if not gallery_data:
				abort(404, "No related content")

			data["galleries"] = gallery_data[:int(target)]
		else:
			abort(400, "No page url specified")

		self.response.out.write(template.render(data))
Exemple #16
0
	def get(self, size="6"):
		template = jinja_environment.get_template("boxes/more-cartoons.html")

		data = {}
		if not "path" in self.request.params:
			webapp2.abort(400, 'No path supplied')

		path = self.request.params["path"]

		content = content_api.read(path, {"show-tags" : "contributor"})
		content_data = json.loads(content)

		authors = [tag for tag in content_data["response"]["content"]["tags"] if tag["type"] == "contributor"]

		if not authors:
			webapp2.abort(500, "No contributors identified")
		

		first_author = authors[0]

		data['contributor'] = first_author

		last_60_days = date.today() - timedelta(days=60)

		query = {
			"tag" : "type/cartoon,{author_id}".format(author_id=first_author["id"]),
			"show-fields" : "headline,thumbnail",
			"page-size" : 50,
			"from-date" : last_60_days.isoformat(),
		}

		cartoon_search_results = content_api.search(query)

		if not cartoon_search_results:
			webapp2.abort(500, "Failed to find more cartoons")

		cartoon_search_data = json.loads(cartoon_search_results)

		cartoon_list = cartoon_search_data.get("response", {}).get("results", [])

		cartoons = [c for c in cartoon_list if "thumbnail" in c.get("fields", {})]

		data["cartoons"] = cartoons[:int(size)]

		headers.set_cors_headers(self.response)
		self.response.out.write(template.render(data))
Exemple #17
0
	def get(self, entries=4):
		template = jinja_environment.get_template("boxes/series.html")
		template_values = {}
		headers.set_cors_headers(self.response)

		if not "path" in self.request.params:
			webapp2.abort(400, "No path specified")

		path = self.request.params["path"]
		content = content_api.read(path, {"show-tags" : "series"})
		content_data = json.loads(content)

		series_tags = [t for t in content_data.get("response", {}).get("content", {}).get("tags",[]) if t.get("type", "") == "series"]

		if not len(series_tags) == 1:
			if series_tags:
				logging.warning("Content did not have a single series tag: %s" % path)
			for tag in series_tags:
				logging.debug(tag)
			webapp2.abort(500, "Single series tag not available")

		series_tag = series_tags[0]
		#logging.info(series_tag)

		query = {
			"tag" : series_tag["id"],
			"show-fields" : "headline,thumbnail",
			"page-size" : 50,
		}

		content = content_api.search(query)

		if not content:
			abort(404, "No content found for series tag")

		content_data = json.loads(content)

		items = content_data.get("response", {}).get("results", [])

		valid_items = [i for i in items if "thumbnail" in i.get("fields", {}) and i['id'] != path[1:]]
		random.shuffle(valid_items)

		template_values["series_name"] = series_tag['webTitle']
		template_values["series_content"] = valid_items[:entries]

		self.response.out.write(template.render(template_values))
Exemple #18
0
	def get(self, entries="4"):
		template = jinja_environment.get_template("recipe-box.html")
		headers.set_cors_headers(self.response)

		if not "path" in self.request.params:
			webapp2.abort(400, "No path specified")

		content = content_api.read(self.request.params["path"], {"show-tags" : "contributor"})
		content_data = json.loads(content)

		authors = [tag for tag in content_data["response"]["content"]["tags"] if tag["type"] == "contributor"]

		if not authors:
			webapp2.abort(500, "No contributors identified")

		first_author = authors[0]

		last_60_days = date.today() - timedelta(days=60)

		query = {
			"tag" : "tone/recipes,{author_id}".format(author_id=first_author["id"]),
			"show-fields" : "headline,thumbnail",
			"page-size" : 50,
			"from-date" : last_60_days.isoformat(),
		}

		content = content_api.search(query)

		if not content:
			webapp2.abort(500, "Failed to read recipes list")

		content_data = json.loads(content)

		recipes = content_data.get("response", {}).get("results", [])

		recipes = [r for r in recipes if "thumbnail" in r.get("fields", {})]
		random.shuffle(recipes)

		data = {
			"author" : authors[0],
			"recipes" : recipes[0:int(entries)],
		}


		self.response.out.write(template.render(data))
Exemple #19
0
	def post(self):

		byline = self.request.get("byline", None)
		country = self.request.headers["X-AppEngine-Country"]

		if not byline:
			abort(400)

		headers.json(self.response)
		headers.set_cors_headers(self.response)
		headers.set_cache_headers(self.response, cache_seconds)

		data = twitter_lookup[byline]

		if not "brand" in data:
			data["brand"] = brand_by_country.get(country, "guardian")

		self.response.out.write(json.dumps(data))
Exemple #20
0
    def get(self, section_id=None):
        if not section_id: section_id = 'all'

        client = memcache.Client()

        ophan_json = client.get(section_id)

        if not ophan_json:
            refresh_data(section_id)
            ophan_json = "[]"

        last_read = client.get(section_id + ".epoch_seconds")

        if last_read and not fresh(last_read):
            refresh_data(section_id)

        headers.json(self.response)
        headers.set_cache_headers(self.response, 60)
        headers.set_cors_headers(self.response)
        self.response.out.write(formats.jsonp(self.request, ophan_json))
Exemple #21
0
	def get(self, section_id = None):
		if not section_id: section_id = 'all'

		client = memcache.Client()

		ophan_json = client.get(section_id)
		
		if not ophan_json:
			refresh_data(section_id)
			ophan_json = "[]"

		last_read = client.get(section_id + ".epoch_seconds")

		if last_read and not fresh(last_read):
			refresh_data(section_id)

		headers.json(self.response)
		headers.set_cache_headers(self.response, 60)
		headers.set_cors_headers(self.response)
		self.response.out.write(formats.jsonp(self.request, ophan_json))
    def get(self, edition):

        client = memcache.Client()
        key = edition
        content_json = client.get(key)
        logging.info("content from memcache with key %s" % key)

        if not content_json:
            logging.info("no content found in memcache")
            content_json = content_api.editors_picks(edition)

        editors_picks = (json.loads(content_json)).get('response').get('editorsPicks')
        
        if editors_picks is None:
            logging.warning("could not parse editorsPicks from the response body")
            return_json = content_json   
        else:
            return_json = json.dumps(editors_picks)   

        headers.json(self.response)
        headers.set_cache_headers(self.response, 60)
        headers.set_cors_headers(self.response)
        self.response.out.write(formats.jsonp(self.request, return_json))
Exemple #23
0
	def get(self):
		headers.set_cors_headers(self.response)
		
		template = jinja_environment.get_template("cards/contributor/flyout.html")
		template_values = {
		}

		if not 'profile-id' in self.request.params:
			webapp2.abort(400, 'No profile id supplied')

		current_path = None
		if 'current-path' in self.request.params:
			current_path = self.request.params['current-path']

		if 'show-logo' in self.request.params:
			template_values['logo'] = images.guardian_logo

		profile_id = self.request.params['profile-id']

		if not profile_id.startswith('/'):
			profile_id = "/" + profile_id

		logging.info(profile_id)

		lookup_params = {
			'page-size' : '30',
			'show-fields' : 'headline,trailText',
			'show-elements' : 'image',
		}
		contributor_json = content_api.read(profile_id, lookup_params)

		#logging.info(contributor_json)

		if not contributor_json:
			webapp2.abort(404, 'Could not find data for profile id: {profile_id}'.format(profile_id=profile_id))

		contributor_data = json.loads(contributor_json)
		
		template_values['contributor'] = contributor_data.get('response', {}).get('tag', {})

		latest_pieces = contributor_data.get('response', {}).get('results', [])

		#logging.info(latest_pieces)

		def suitable_piece(latest_pieces):

			for piece in latest_pieces:
				if not 'elements' in piece:
					continue

				for element in piece['elements']:
					if not 'assets' in element:
						continue
					if not "image" in element.get("type", ""):
						continue

					suitable_assets = [a for a in element['assets'] if 'typeData' in a and "300" in a['typeData'].get('width', '')]

					if suitable_assets:
						piece['promo_image'] = suitable_assets[0]
						yield piece
			yield None

		suitable_pieces = suitable_piece(latest_pieces)

		suitable_piece = suitable_pieces.next()

		if current_path:
			while suitable_piece['id'] in current_path:
				suitable_piece = suitable_pieces.next()

		if not suitable_piece:
			webapp2.abort(404, 'No suitable pieces found')

		template_values['promoted'] = suitable_piece

		self.response.out.write(template.render(template_values))
Exemple #24
0
	def get(self):

		headers.json(self.response)
		headers.set_cors_headers(self.response)
		headers.set_cache_headers(self.response, cache_seconds)
		self.response.out.write(json.dumps(contributors))
Exemple #25
0
	def get(self):
		headers.set_cors_headers(self.response)
		
		template = jinja_environment.get_template("flyouts/section/latest.html")
		template_values = {
			'logo' : images.guardian_logo,
		}


		current_path = None
		if 'current-path' in self.request.params:
			current_path = self.request.params['current-path'] 

		lookup_params = {
			'page-size' : '30',
			'show-fields' : 'headline,trailText',
			'show-elements' : 'image',
			'show-editors-picks' : 'true',
			'edition' : 'us',
			'tag' : 'type/article',
		}
		cif_us_json = content_api.read('/us/commentisfree', lookup_params)

		#logging.info(contributor_json)

		if not cif_us_json:
			webapp2.abort(404, 'Could not find data for US Cif')

		cif_data = json.loads(cif_us_json)

		latest_pieces = cif_data.get('response', {}).get('editorsPicks', [])

		#logging.info(latest_pieces)

		def suitable_piece(latest_pieces):

			for piece in latest_pieces:
				if not 'elements' in piece:
					continue

				for element in piece['elements']:
					if not 'assets' in element:
						continue
					if not "image" in element.get("type", ""):
						continue

					suitable_assets = [a for a in element['assets'] if 'typeData' in a and "300" in a['typeData'].get('width', '')]

					if suitable_assets:
						piece['promo_image'] = suitable_assets[0]
						yield piece
			yield None

		suitable_pieces = suitable_piece(latest_pieces)

		suitable_piece = suitable_pieces.next()

		if current_path:
			while suitable_piece['id'] in current_path:
				suitable_piece = suitable_pieces.next()

		if not suitable_piece:
			webapp2.abort(404, 'No suitable pieces found')

		template_values['promoted'] = suitable_piece

		self.response.out.write(template.render(template_values))