def index(request): context = RequestContext(request) try: page = kegweb_models.Page.objects.get(name__exact='MainPage', status__exact='published') except kegweb_models.Page.DoesNotExist: page = None context['page_node'] = page context['taps'] = request.kbsite.taps.all() try: session = request.kbsite.sessions.latest() if session.IsActiveNow(): context['current_session'] = session except models.DrinkingSession.DoesNotExist: pass recent_images = models.Picture.objects.filter( site=request.kbsite, drink__isnull=False).order_by('-time')[:9] context['recent_images'] = recent_images events = request.kbsite.events.all()[:10] context['initial_events'] = kbjson.dumps( [protolib.ToDict(e, full=True) for e in events], indent=None) sessions = request.kbsite.sessions.all().order_by('-seqn')[:10] context['initial_sessions'] = kbjson.dumps( [protolib.ToDict(s, full=True) for s in sessions], indent=None) return render_to_response('index.html', context)
def index(request): context = RequestContext(request) context['taps'] = models.KegTap.objects.all() events = models.SystemEvent.objects.all()[:10] context['initial_events'] = kbjson.dumps( [protolib.ToDict(e, full=True) for e in events], indent=None) sessions = models.DrinkingSession.objects.all().order_by('-id')[:10] context['sessions'] = sessions context['initial_sessions'] = kbjson.dumps( [protolib.ToDict(s, full=True) for s in sessions], indent=None) if sessions: last_session = sessions[0] context['last_session'] = last_session if sessions and last_session.IsActiveNow(): context['current_session'] = last_session if sessions.count() > 1: context['last_session'] = sessions[1] else: context['last_session'] = None taps = models.KegTap.objects.filter(current_keg__isnull=False) context['initial_taps'] = kbjson.dumps( [protolib.ToDict(t, full=True) for t in taps], indent=None) context['have_events'] = len(events) > 0 context['have_taps'] = len(taps) > 0 return render_to_response('index.html', context_instance=context)
def index(request): context = RequestContext(request) context['taps'] = models.KegTap.objects.all() events = models.SystemEvent.objects.all()[:10] context['initial_events'] = kbjson.dumps([protolib.ToDict(e, full=True) for e in events], indent=None) sessions = models.DrinkingSession.objects.all().order_by('-id')[:10] context['sessions'] = sessions context['initial_sessions'] = kbjson.dumps([protolib.ToDict(s, full=True) for s in sessions], indent=None) if sessions: last_session = sessions[0] context['last_session'] = last_session if sessions and last_session.IsActiveNow(): context['current_session'] = last_session if sessions.count() > 1: context['last_session'] = sessions[1] else: context['last_session'] = None taps = models.KegTap.objects.filter(current_keg__isnull=False) context['initial_taps'] = kbjson.dumps([protolib.ToDict(t, full=True) for t in taps], indent=None) context['have_events'] = len(events) > 0 context['have_taps'] = len(taps) > 0 return render_to_response('index.html', context_instance=context)
def index(request): context = RequestContext(request) try: page = kegweb_models.Page.objects.get(name__exact='MainPage', status__exact='published') except kegweb_models.Page.DoesNotExist: page = None context['page_node'] = page context['taps'] = request.kbsite.taps.all() try: session = request.kbsite.sessions.latest() if session.IsActiveNow(): context['current_session'] = session except models.DrinkingSession.DoesNotExist: pass recent_images = models.Picture.objects.filter( site=request.kbsite, drink__isnull=False).order_by('-time')[:9] context['recent_images'] = recent_images events = request.kbsite.events.all()[:10] context['initial_events'] = kbjson.dumps([protolib.ToDict(e, full=True) for e in events], indent=None) sessions = request.kbsite.sessions.all().order_by('-seqn')[:10] context['initial_sessions'] = kbjson.dumps([protolib.ToDict(s, full=True) for s in sessions], indent=None) return render_to_response('index.html', context)
def forwards(self, orm): for row in orm['plugin.PluginData'].objects.all(): try: # Do nothing if already valid json. kbjson.loads(row.value) except ValueError: print ' ~ {} -> {}'.format(repr(row.value), repr(kbjson.dumps(row.value))) row.value = kbjson.dumps(row.value) row.save()
def workers(request): context = RequestContext(request) try: inspector = celery_app.control.inspect() pings = inspector.ping() or {} stats = inspector.stats() or {} queues = inspector.active_queues() or {} except redis.RedisError as e: context['error'] = e status = {} if not pings and 'error' not in context: context['error'] = 'No response from workers. Not running?' else: for k, v in pings.iteritems(): status[k] = { 'status': 'ok' if v.get('ok') else 'unknown', } for k, v in stats.iteritems(): if k in status: status[k]['stats'] = v for k, v in queues.iteritems(): if k in status: status[k]['active_queues'] = v context['status'] = status context['raw_stats'] = kbjson.dumps(context['status'], indent=2) return render_to_response('kegadmin/workers.html', context_instance=context)
def slack_post(url, event_dict): """Posts an event to slack. The request body is a JSON dictionary of: * type: webhook message type (currently always 'event') * event_dict: webhook data (the event payload) Event payloads are in the same format as the /api/events/ endpoint. """ logger.info('Posting to slack: url=%s event=%s' % (url, event_dict)) hook_dict = { 'type': 'event', 'data': event_dict, } headers = { 'content-type': 'application/json', 'user-agent': 'Kegbot/%s' % get_version(), } try: return requests.post(url, data=kbjson.dumps(hook_dict), headers=headers) except requests.exceptions.RequestException, e: logger.warning('Error posting hook: %s' % e) return False
def slack_post(url, event_dict, slack_conf, msg): """Posts an event to slack. The request body is a JSON dictionary of: * type: webhook message type (currently always 'event') * event_dict: webhook data (the event payload) Event payloads are in the same format as the /api/events/ endpoint. """ logger.info('Posting to slack: url=%s event=%s' % (url, event_dict)) hook_dict = { 'type': 'event', 'payload': { "channel": slack_conf.channel, "username": event_dict.user.username, "text": msg, "icon_url": "https://avatars3.githubusercontent.com/u/395880" } } headers = { 'content-type': 'application/json', 'user-agent': 'Kegbot/%s' % get_version(), } try: return requests.post(url, data=kbjson.dumps(hook_dict), headers=headers) except requests.exceptions.RequestException, e: logger.warning('Error posting hook: %s' % e) return False
def admin_settings(request, plugin): context = RequestContext(request) settings_form = plugin.get_site_settings_form() if request.method == 'POST': if 'submit-settings' in request.POST: settings_form = forms.SiteSettingsForm(request.POST) if settings_form.is_valid(): client_id = settings_form.cleaned_data['client_id'] client_secret = settings_form.cleaned_data['client_secret'] venue_id = settings_form.cleaned_data['venue_id'] client = foursquare.Foursquare(client_id=client_id, client_secret=client_secret) venue = None try: # Search for the venue. Simultaneous validates all three credentials. if venue_id: venue = client.venues(venue_id) except foursquare.FoursquareException, e: messages.error(request, 'Error testing Foursquare connection: %s' % str(e)) else: plugin.save_site_settings_form(settings_form) plugin.save_venue_detail(venue) messages.success(request, 'Settings updated') if 'test-api' in request.POST: plugin = request.plugins['foursquare'] client = plugin.get_foursquare_client() venue_id = plugin.get_venue_id() or '49d01698f964a520fd5a1fe3' # Golden Gate Bridge try: venue_info = client.venues(venue_id) context['test_response'] = kbjson.dumps(venue_info, indent=2) messages.success(request, 'API test successful.') except foursquare.FoursquareException as e: messages.success(request, 'API test failed: {}'.format(e.message))
def get_db_prep_save(self, value, connection): """Convert our JSON object to a string before we save""" if not value: return super(JSONField, self).get_db_prep_save("", connection=connection) else: return super(JSONField, self).get_db_prep_save(kbjson.dumps(value), connection=connection)
def admin_settings(request, plugin): context = RequestContext(request) settings_form = plugin.get_site_settings_form() if request.method == 'POST': if 'submit-settings' in request.POST: settings_form = forms.SiteSettingsForm(request.POST) if settings_form.is_valid(): plugin.save_site_settings_form(settings_form) venue_id = settings_form.cleaned_data.get('venue_id') venue = None if venue_id: client = plugin.get_foursquare_client() try: venue = client.venues(venue_id) except foursquare.FoursquareException, e: messages.error(request, 'Error fetching venue information: %s' % str(e)) plugin.save_venue_detail(venue) messages.success(request, 'Settings updated.') if 'test-api' in request.POST: plugin = request.plugins['foursquare'] client = plugin.get_foursquare_client() venue_id = plugin.get_venue_id() or '49d01698f964a520fd5a1fe3' # Golden Gate Bridge try: venue_info = client.venues(venue_id) context['test_response'] = kbjson.dumps(venue_info, indent=2) messages.success(request, 'API test successful.') except foursquare.FoursquareException as e: messages.success(request, 'API test failed: {}'.format(e.message))
def webhook_post(url, event_dict): """Posts an event to the supplied URL. The request body is a JSON dictionary of: * type: webhook message type (currently always 'event') * event_dict: webhook data (the event payload) Event payloads are in the same format as the /api/events/ endpoint. """ logger.info('Posting webhook: url=%s event=%s' % (url, event_dict)) hook_dict = { 'type': 'event', 'data': event_dict, } headers = { 'content-type': 'application/json', 'user-agent': 'Kegbot/%s' % get_version(), } try: return requests.post(url, data=kbjson.dumps(hook_dict), headers=headers) except requests.exceptions.RequestException, e: logger.warning('Error posting hook: %s' % e) return False
def do_post(event, kb_vars): """Sends the activity to the jive instance""" user = event.user if not user: logger.info('No user for this event no jive activity post is possible') return kind = event.kind post = None if kind == 'session_joined': post = DEFAULT_SYSTEM_SESSION_JOINED_TEMPLATE % kb_vars elif kind == 'drink_poured': post = DEFAULT_SYSTEM_DRINK_POURED_TEMPLATE % kb_vars json = kbjson.dumps(build_model(user, post, kb_vars)) url = build_url() password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, url, JIVE_USERNAME, JIVE_PASSWORD) auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr) opener = urllib2.build_opener(auth_handler) urllib2.install_opener(opener) f = urllib2.urlopen(url, json) response = f.read() logger.info("jive response %s" % str(response))
def admin_settings(request, plugin): context = RequestContext(request) settings_form = plugin.get_site_settings_form() if request.method == 'POST': if 'submit-settings' in request.POST: settings_form = forms.SiteSettingsForm(request.POST) if settings_form.is_valid(): plugin.save_site_settings_form(settings_form) venue_id = settings_form.cleaned_data.get('venue_id') venue = None if venue_id: client = plugin.get_foursquare_client() try: venue = client.venues(venue_id) except foursquare.FoursquareException, e: messages.error( request, 'Error fetching venue information: %s' % str(e)) plugin.save_venue_detail(venue) messages.success(request, 'Settings updated.') if 'test-api' in request.POST: plugin = request.plugins['foursquare'] client = plugin.get_foursquare_client() venue_id = plugin.get_venue_id( ) or '49d01698f964a520fd5a1fe3' # Golden Gate Bridge try: venue_info = client.venues(venue_id) context['test_response'] = kbjson.dumps(venue_info, indent=2) messages.success(request, 'API test successful.') except foursquare.FoursquareException as e: messages.success(request, 'API test failed: {}'.format(e.message))
def build_response(result_data, response_code=200, callback=None): """Builds an HTTP response for JSON data.""" indent = 2 json_str = kbjson.dumps(result_data, indent=indent) if callback and validate_jsonp.is_valid_jsonp_callback_value(callback): json_str = '%s(%s);' % (callback, json_str) return HttpResponse(json_str, mimetype='application/json', status=response_code)
def post_webhook_event(hook_url, event_list): post_data = kbjson.dumps({"events": [protolib.ToDict(e) for e in event_list]}) post_data = urlencode({"payload": post_data}) opener = urllib2.build_opener() opener.addheaders = [("User-agent", "Kegbot/%s" % util.get_version("kegbot"))] try: opener.open(hook_url, data=post_data, timeout=5) return True except urllib2.URLError: return False
def _save_profile(self, datastore_key, oauth_token, oauth_token_secret, twitter_name, twitter_id): profile = { KEY_OAUTH_TOKEN: oauth_token, KEY_OAUTH_TOKEN_SECRET: oauth_token_secret, KEY_TWITTER_NAME: twitter_name, KEY_TWITTER_ID: twitter_id, } self.datastore.set(datastore_key, kbjson.dumps(profile)) return profile
def index(request): context = RequestContext(request) try: page = kegweb_models.Page.objects.get(name__exact='MainPage', status__exact='published') except kegweb_models.Page.DoesNotExist: page = None context['page_node'] = page context['taps'] = request.kbsite.taps.all() events = request.kbsite.events.all()[:10] context['initial_events'] = kbjson.dumps([protolib.ToDict(e, full=True) for e in events], indent=None) sessions = request.kbsite.sessions.all().order_by('-seqn')[:10] context['sessions'] = sessions context['initial_sessions'] = kbjson.dumps([protolib.ToDict(s, full=True) for s in sessions], indent=None) return render_to_response('index.html', context)
def new_function(*args, **kwargs): try: return f(*args, **kwargs) except Exception, e: exc_info = sys.exc_info() request = args[0] if settings.DEBUG and "deb" in request.GET: raise exc_info[1], None, exc_info[2] result_data, http_code = ToJsonError(e, exc_info) result_data["meta"] = {"result": "error"} return HttpResponse(kbjson.dumps(result_data, indent=2), mimetype="application/json", status=http_code)
def index(request): context = RequestContext(request) context['taps'] = request.kbsite.taps.all() events = request.kbsite.events.all()[:10] context['initial_events'] = kbjson.dumps([protolib.ToDict(e, full=True) for e in events], indent=None) sessions = request.kbsite.sessions.all().order_by('-id')[:10] context['sessions'] = sessions context['initial_sessions'] = kbjson.dumps([protolib.ToDict(s, full=True) for s in sessions], indent=None) taps = request.kbsite.taps.filter(current_keg__isnull=False) context['initial_taps'] = kbjson.dumps([protolib.ToDict(t, full=True) for t in taps], indent=None) context['have_events'] = len(events) > 0 context['have_taps'] = len(taps) > 0 return render_to_response('index.html', context_instance=context)
def post_webhook_event(hook_url, event_list): post_data = kbjson.dumps({'events': [protolib.ToDict(e) for e in event_list]}) post_data = urlencode({'payload': post_data}) opener = urllib2.build_opener() opener.addheaders = [ ('User-agent', 'Kegbot/%s' % util.get_version('kegbot')), ] try: opener.open(hook_url, data=post_data, timeout=5) return True except urllib2.URLError: return False
def post_webhook_event(hook_url, event_list): post_data = kbjson.dumps( {'events': [protolib.ToDict(e) for e in event_list]}) post_data = urlencode({'payload': post_data}) opener = urllib2.build_opener() opener.addheaders = [ ('User-agent', 'Kegbot/%s' % util.get_version('kegbot')), ] try: opener.open(hook_url, data=post_data, timeout=5) return True except urllib2.URLError: return False
def new_function(*args, **kwargs): try: return f(*args, **kwargs) except Exception, e: exc_info = sys.exc_info() request = args[0] if settings.DEBUG and 'deb' in request.GET: raise exc_info[1], None, exc_info[2] result_data, http_code = ToJsonError(e, exc_info) result_data['meta'] = {'result': 'error'} return HttpResponse(kbjson.dumps(result_data, indent=2), mimetype='application/json', status=http_code)
def post_webhook(url, event): """Posts an event to the supplied URL.""" logger.info('Posting webhook: url=%s event=%s' % (url, event)) post_data = kbjson.dumps({'events': [protolib.ToDict(event)]}) post_data = urlencode({'payload': post_data}) opener = urllib2.build_opener() opener.addheaders = [ ('User-agent', 'Kegbot/%s' % util.get_version('kegbot')), ] try: opener.open(hook_url, data=post_data, timeout=5) return True except urllib2.URLError: return False
def format(self, record): """ JSON-encode a record for serializing through redis. Convert date to iso format, and stringify any exceptions. """ data = record._raw.copy() # serialize the datetime date as utc string data['time'] = data['time'].isoformat() # stringify exception data if data.get('traceback'): data['traceback'] = self.formatException(data['traceback']) return json.dumps(data)
def build_response(request, result_data, response_code=200): """Builds an HTTP response for JSON data.""" callback = request.GET.get('callback') format = request.GET.get('format', None) debug = request.GET.get('debug', False) indent = 2 json_str = kbjson.dumps(result_data, indent=indent) if callback and validate_jsonp.is_valid_jsonp_callback_value(callback): json_str = '%s(%s);' % (callback, json_str) if format == 'html' or (settings.DEBUG and debug): html = '<html><body><pre>%s</pre></body></html>' % json_str return HttpResponse(html, mimetype='text/html', status=response_code) else: return HttpResponse(json_str, mimetype='application/json', status=response_code)
def new_function(*args, **kwargs): request = args[0] http_code = 200 indent = 2 if "indent" in request.GET: if request.GET["indent"] == "": indent = None else: try: indent_val = int(request.GET["indent"]) if indent_val >= 0 and indent_val <= 8: indent = indent_val except ValueError: pass result_data = prepare_data(f(*args, **kwargs)) result_data["meta"] = {"result": "ok"} return HttpResponse(kbjson.dumps(result_data, indent=indent), mimetype="application/json", status=http_code)
def autocomplete_user(request): search = request.GET.get('q') if search: users = models.User.objects.filter(Q(username__icontains=search) | Q(email__icontains=search)) else: users = models.User.objects.all() users = users[:10] # autocomplete widget limited to 10 values = [] for user in users: values.append({ 'username': user.username, 'id': user.id, 'email': user.email, 'is_active': user.is_active, }) return HttpResponse(kbjson.dumps(values, indent=None), mimetype='application/json', status=200)
def autocomplete_beverage(request): search = request.GET.get('q') if search: beverages = models.Beverage.objects.filter(Q(name__icontains=search) | Q(producer__name__icontains=search)) else: beverages = models.Beverage.objects.all() beverages = beverages[:10] # autocomplete widget limited to 10 values = [] for beverage in beverages: values.append({ 'name': beverage.name, 'id': beverage.id, 'producer_name': beverage.producer.name, 'producer_id': beverage.producer.id, 'style': beverage.style, }) return HttpResponse(kbjson.dumps(values, indent=None), content_type='application/json', status=200)
def autocomplete_user(request): search = request.GET.get('q') if search: users = models.User.objects.filter(Q(username__icontains=search) | Q(email__icontains=search) | Q(display_name__icontains=search)) else: users = models.User.objects.all() users = users[:10] # autocomplete widget limited to 10 values = [] for user in users: values.append({ 'username': user.username, 'id': user.id, 'email': user.email, 'display_name': user.get_full_name(), 'is_active': user.is_active, }) return HttpResponse(kbjson.dumps(values, indent=None), content_type='application/json', status=200)
def autocomplete_beverage(request): search = request.GET.get('q') if search: beverages = models.Beverage.objects.filter(Q(name__icontains=search) | Q(producer__name__icontains=search)) else: beverages = models.Beverage.objects.all() beverages = beverages[:10] # autocomplete widget limited to 10 values = [] for beverage in beverages: values.append({ 'name': beverage.name, 'id': beverage.id, 'producer_name': beverage.producer.name, 'producer_id': beverage.producer.id, 'style': beverage.style, }) return HttpResponse(kbjson.dumps(values, indent=None), mimetype='application/json', status=200)
def autocomplete_token(request): search = request.GET.get('q') if search: tokens = models.AuthenticationToken.objects.filter( Q(token_value__icontains=search) | Q(nice_name__icontains=search)) else: tokens = models.AuthenticationToken.objects.all() tokens = tokens[:10] # autocomplete widget limited to 10 values = [] for token in tokens: values.append({ 'username': token.user.username, 'id': token.id, 'auth_device': token.auth_device, 'token_value': token.token_value, 'enabled': token.enabled, }) return HttpResponse(kbjson.dumps(values, indent=None), content_type='application/json', status=200)
def new_function(*args, **kwargs): request = args[0] http_code = 200 indent = 2 if 'indent' in request.GET: if request.GET['indent'] == '': indent = None else: try: indent_val = int(request.GET['indent']) if indent_val >= 0 and indent_val <= 8: indent = indent_val except ValueError: pass result_data = prepare_data(f(*args, **kwargs)) result_data['meta'] = {'result': 'ok'} return HttpResponse(kbjson.dumps(result_data, indent=indent), mimetype='application/json', status=http_code)
def autocomplete_token(request): search = request.GET.get('q') if search: tokens = models.AuthenticationToken.objects.filter( Q(token_value__icontains=search) | Q(nice_name__icontains=search)) else: tokens = models.AuthenticationToken.objects.all() tokens = tokens[:10] # autocomplete widget limited to 10 values = [] for token in tokens: values.append({ 'username': token.user.username, 'id': token.id, 'auth_device': token.auth_device, 'token_value': token.token_value, 'enabled': token.enabled, }) return HttpResponse(kbjson.dumps(values, indent=None), mimetype='application/json', status=200)
def dump(output_fp, kbsite, indent=None, log_cb=_no_log): """Produce a dump of this Kegbot system to the given filestream. In its current format, the dump is plaintext JSON string consisting of all important data, including tap configuration, drink history, and user account details. All "derived" tables are NOT backed up. These are tables with data that can be regenerated at any time without any loss of history. Specifically: - session chunks - user session chunks - keg session chunks - keg stats - user stats - session stats - system events """ res = {} items = ( ('bdb_brewers', bdb_models.Brewer.objects.all()), ('bdb_styles', bdb_models.BeerStyle.objects.all()), ('bdb_beertypes', bdb_models.BeerType.objects.all()), ('thermosensors', kbsite.thermosensors.all().order_by('id')), ('coinselectors', kbsite.coinselectors.all().order_by('id')), ('kegs', kbsite.kegs.all().order_by('id')), ('taps', kbsite.taps.all().order_by('id')), ('sessions', kbsite.sessions.all().order_by('id')), ('thermologs', kbsite.thermologs.all().order_by('-id')[:60*24]), ('thermosummarylogs', kbsite.thermosummarylogs.all().order_by('id')), ('users', models.User.objects.all().order_by('id')), ('profiles', models.UserProfile.objects.all().order_by('id')), ('drinks', kbsite.drinks.valid().order_by('id')), ('tokens', kbsite.tokens.all().order_by('id')), ) log_cb('Generating backup data ...') for name, qs in items: log_cb(' .. dumping %s' % name) res[name] = list(protolib.ToDict(qs, full=True)) log_cb('Serializing and writing backup data ...') output_fp.write(kbjson.dumps(res, indent=indent))
def autocomplete_beer_type(request): context = RequestContext(request) search = request.GET.get('q') if search: types = models.BeerType.objects.filter(Q(name__icontains=search) | Q(brewer__name__icontains=search)) else: types = models.BeerType.objects.all() types = types[:10] # autocomplete widget limited to 10 values = [] for beer in types: values.append({ 'name': beer.name, 'id': beer.id, 'brewer_name': beer.brewer.name, 'brewer_id': beer.brewer.id, 'style_name': beer.style.name, 'style_id': beer.style.id, }) return HttpResponse(kbjson.dumps(values, indent=None), mimetype='application/json', status=200)
def new_function(*args, **kwargs): request = args[0] http_code = 200 indent = 2 if 'indent' in request.GET: if request.GET['indent'] == '': indent = None else: try: indent_val = int(request.GET['indent']) if indent_val >= 0 and indent_val <= 8: indent = indent_val except ValueError: pass result_data = prepare_data(f(*args, **kwargs)) result_data['meta'] = { 'result': 'ok' } return HttpResponse(kbjson.dumps(result_data, indent=indent), mimetype='application/json', status=http_code)
def admin_settings(request, plugin): context = RequestContext(request) settings_form = plugin.get_site_settings_form() if request.method == 'POST': if 'submit-settings' in request.POST: settings_form = forms.SiteSettingsForm(request.POST) if settings_form.is_valid(): client_id = settings_form.cleaned_data['client_id'] client_secret = settings_form.cleaned_data['client_secret'] venue_id = settings_form.cleaned_data['venue_id'] client = foursquare.Foursquare(client_id=client_id, client_secret=client_secret) venue = None try: # Search for the venue. Simultaneous validates all three credentials. if venue_id: venue = client.venues(venue_id) except foursquare.FoursquareException, e: messages.error( request, 'Error testing Foursquare connection: %s' % str(e)) else: plugin.save_site_settings_form(settings_form) plugin.save_venue_detail(venue) messages.success(request, 'Settings updated') if 'test-api' in request.POST: plugin = request.plugins['foursquare'] client = plugin.get_foursquare_client() venue_id = plugin.get_venue_id( ) or '49d01698f964a520fd5a1fe3' # Golden Gate Bridge try: venue_info = client.venues(venue_id) context['test_response'] = kbjson.dumps(venue_info, indent=2) messages.success(request, 'API test successful.') except foursquare.FoursquareException as e: messages.success(request, 'API test failed: {}'.format(e.message))
def autocomplete_beer_type(request): context = RequestContext(request) search = request.GET.get('q') if search: types = models.BeerType.objects.filter( Q(name__icontains=search) | Q(brewer__name__icontains=search)) else: types = models.BeerType.objects.all() types = types[:10] # autocomplete widget limited to 10 values = [] for beer in types: values.append({ 'name': beer.name, 'id': beer.id, 'brewer_name': beer.brewer.name, 'brewer_id': beer.brewer.id, 'style_name': beer.style.name, 'style_id': beer.style.id, }) return HttpResponse(kbjson.dumps(values, indent=None), mimetype='application/json', status=200)
class ChartNode(Node): CHART_TMPL = ''' <!-- begin chart %(chart_id)s --> <div id="chart-%(chart_id)s-container" style="height: %(height)spx; width: %(width)spx;" class="kb-chartbox"></div> <script type="text/javascript"> var chart_%(chart_id)s; $(document).ready(function() { var chart_data = %(chart_data)s; chart_%(chart_id)s = new Highcharts.Chart(chart_data); }); </script> <!-- end chart %(chart_id)s --> ''' ERROR_TMPL = ''' <!-- begin chart %(chart_id)s --> <div id="chart-%(chart_id)s-container" style="height: %(height)spx; width: %(width)spx;" class="kb-chartbox-error"> %(error_str)s </div> <!-- end chart %(chart_id)s --> ''' def __init__(self, charttype, width, height, args): self._charttype = charttype self._width = width self._height = height self._args = args try: self._chart_fn = getattr(self, 'chart_%s' % (self._charttype, )) except AttributeError: raise TemplateSyntaxError('unknown chart type: %s' % self._charttype) def _get_chart_id(self, context): # TODO(mikey): Is there a better way to store _CHART_ID? if not hasattr(context, '_CHART_ID'): context._CHART_ID = 0 context._CHART_ID += 1 return context._CHART_ID def render(self, context): chart_id = self._get_chart_id(context) width = self._width height = self._height obj = Variable(self._args[0]).resolve(context) try: chart_result = self._chart_fn(obj) except charts.ChartError, e: error_str = 'chart error: %s' % (e, ) return ChartNode.ERROR_TMPL % vars() chart_base = { 'chart': { 'borderColor': '#eeeeff', 'borderWidth': 0, 'renderTo': 'chart-%s-container' % chart_id, }, 'credits': { 'enabled': False, }, 'legend': { 'enabled': False, }, 'margin': [0, 0, 0, 0], 'title': { 'text': None, }, 'yAxis': { 'labels': { 'align': 'left' }, 'title': { 'text': None, } }, } chart_data = chart_base for k, v in chart_result.iteritems(): if k not in chart_data: chart_data[k] = v elif type(v) == type({}): chart_data[k].update(v) else: chart_data[k] = v chart_data = kbjson.dumps(chart_data, indent=None) return ChartNode.CHART_TMPL % vars()
def ToJson(self, indent=2): return kbjson.dumps(self.ToDict(), indent=indent)
def build_response(result_data, response_code=200): """Builds an HTTP response for JSON data.""" indent = 2 return HttpResponse(kbjson.dumps(result_data, indent=indent), mimetype='application/json', status=response_code)
class ChartNode(Node): CHART_TMPL = ''' <!-- begin chart %(chart_id)s --> <div id="chart-%(chart_id)s-container" style="height: %(height)spx; width: %(width)spx;" class="kb-chartbox"></div> <script type="text/javascript"> var chart_%(chart_id)s; $(document).ready(function() { var chart_data = %(chart_data)s; chart_%(chart_id)s = new Highcharts.Chart(chart_data); }); </script> <!-- end chart %(chart_id)s --> ''' ERROR_TMPL = ''' <!-- begin chart %(chart_id)s --> <div id="chart-%(chart_id)s-container" style="height: %(height)spx; width: %(width)spx;" class="kb-chartbox-error"> %(error_str)s </div> <!-- end chart %(chart_id)s --> ''' def __init__(self, charttype, width, height, args): self._charttype = charttype self._width = width self._height = height self._args = args self._chart_fn = getattr(charts, 'chart_%s' % (self._charttype, ), None) def _get_chart_id(self, context): # TODO(mikey): Is there a better way to store _CHART_ID? if not hasattr(context, '_CHART_ID'): context._CHART_ID = 0 context._CHART_ID += 1 return context._CHART_ID def show_error(self, error_str): ctx = { 'error_str': error_str, 'chart_id': 0, 'width': self._width, 'height': self._height, } return ChartNode.ERROR_TMPL % ctx def render(self, context): if not self._chart_fn: return self.show_error("Unknown chart type: %s" % self._charttype) chart_id = self._get_chart_id(context) obj = Variable(self._args[0]).resolve(context) metric_volumes = context.get('metric_volumes', False) temperature_units = context.get('temperature_display_units', 'f') try: chart_result = self._chart_fn(obj, metric_volumes=metric_volumes, temperature_units=temperature_units) except charts.ChartError, e: return self.show_error(str(e)) chart_base = { 'chart': { 'borderColor': '#eeeeff', 'borderWidth': 0, 'renderTo': 'chart-%s-container' % chart_id, }, 'credits': { 'enabled': False, }, 'legend': { 'enabled': False, }, 'margin': [0, 0, 0, 0], 'title': { 'text': None, }, 'yAxis': { 'labels': { 'align': 'left' }, 'title': { 'text': None, } }, } chart_data = chart_base for k, v in chart_result.iteritems(): if k not in chart_data: chart_data[k] = v elif isinstance(v, dict): chart_data[k].update(v) else: chart_data[k] = v chart_data = kbjson.dumps(chart_data, indent=None) ctx = { 'chart_id': chart_id, 'width': self._width, 'height': self._height, 'chart_data': chart_data, } return ChartNode.CHART_TMPL % ctx
def __repr__(self): return kbjson.dumps(self)
def save_venue_detail(self, detail): self.datastore.set(KEY_VENUE_DETAIL, kbjson.dumps(detail))
def save_user_profile(self, user, profile): self.datastore.set('user_detail:%s' % user.id, kbjson.dumps(profile))