<gh_stars>10-100

from datetime import datetime, timedelta
from functools import wraps
import logging

from contextlib2 import contextmanager
from flask import request

from myapp import app
from myapp.utils.dates import now_as_float




@contextmanager
def stats_timing(stats_key, stats_logger):
    """Provide a transactional scope around a series of operations."""
    start_ts = now_as_float()
    try:
        yield start_ts
    except Exception as e:
        raise e
    finally:
        stats_logger.timing(stats_key, now_as_float() - start_ts)


def etag(check_perms=bool):

    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            # check if the user can access the resource
            check_perms(*args, **kwargs)

            if request.method == "POST":
                return f(*args, **kwargs)

            response = None

            if response is None:
                response = f(*args, **kwargs)

            return response.make_conditional(request)

        return wrapper

    return decorator
