예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
def webhook_post(url, event):
    """Posts an event to the supplied URL.

    The request body is a JSON dictionary of:
      * type: webhook message type (currently always 'event')
      * data: 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))

    event_dict = protolib.ToDict(event)
    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
예제 #4
0
 def handle_event(self, event):
     self.logger.info("Handling new event: %s" % event.id)
     settings = self.get_site_settings()
     urls = settings.get("webhook_urls", "").strip().split()
     event_dict = protolib.ToDict(event, full=True)
     for url in urls:
         with SuppressTaskErrors(self.logger):
             tasks.webhook_post.delay(url, event_dict)
예제 #5
0
    def RecordDrink(self,
                    tap_name,
                    ticks,
                    volume_ml=None,
                    username=None,
                    pour_time=None,
                    duration=0,
                    auth_token=None,
                    spilled=False,
                    do_postprocess=True):

        tap = self._GetTapFromName(tap_name)
        if not tap:
            raise BackendError, "Tap unknown"

        if volume_ml is None:
            volume_ml = float(ticks) * tap.ml_per_tick

        user = None
        if username:
            user = self._GetUserObjFromUsername(username)

        if not pour_time:
            pour_time = datetime.datetime.now()

        keg = None
        if tap.current_keg and tap.current_keg.status == 'online':
            keg = tap.current_keg

        if spilled:
            if not keg:
                self._logger.warning(
                    'Got spilled pour for tap missing keg; ignoring')
                return
            keg.spilled_ml += volume_ml
            keg.save()
            return

        d = models.Drink(ticks=ticks,
                         site=self._site,
                         keg=keg,
                         user=user,
                         volume_ml=volume_ml,
                         starttime=pour_time,
                         duration=duration,
                         auth_token=auth_token)
        models.DrinkingSession.AssignSessionForDrink(d)
        d.save()
        if do_postprocess:
            d.PostProcess()
            hook_url = self._site.settings.event_web_hook
            if hook_url:
                events = models.SystemEvent.objects.filter(drink=d)
                if events:
                    event_list = [protolib.ToDict(e) for e in events]
                    tasks.post_webhook_event.delay(hook_url, event_list)

        return protolib.ToProto(d)
예제 #6
0
    def handle_event(self, event):
        self.logger.info('Handling new event: %s' % event.id)
        settings = self.get_site_settings()
        url = self.generate_slack_msg()
        event_dict = protolib.ToDict(event, full=True)
        msg = self.generate_slack_msg(settings, event_dict)
        if 'image' in event_dict:
            image_file = self.get_image_file(event_dict['image']['url'])

        if post:
            with SuppressTaskErrors(self.logger):
                tasks.slack_post.delay(url, post)
예제 #7
0
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
예제 #8
0
 def handle_event(self, event):
     self.logger.info('Handling new event: %s' % event.id)
     settings = self.get_site_settings()
     event_dict = protolib.ToDict(event, full=True)
     msg = self.generate_slack_msg(settings, event_dict)
     #import ipdb; ipdb.set_trace()
     try:
         url = event_dict['drink']['images'][0]['original_url']
     except:
         url = None
     if url:
         image_file = '/home/federico/kegbot-data/' + url.split('/', 3)[3]
     else:
         image_file = ''
     with SuppressTaskErrors(self.logger):
         tasks.slack_post(self.slack_config(), msg, image_file)
예제 #9
0
파일: backup.py 프로젝트: swc/kegbot
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))
예제 #10
0
def obj_to_dict(o):
    return protolib.ToDict(o)