from flask import current_app
from functools import wraps
from hashlib import md5

from changes.ext.redis import UnableToGetLock
from changes.config import redis


def lock(func):
    @wraps(func)
    def wrapped(**kwargs):
        key = '{0}:{1}'.format(
            func.__name__,
            md5(
                '&'.join('{0}={1}'.format(k, repr(v))
                for k, v in sorted(kwargs.iteritems()))
            ).hexdigest()
        )
        try:
            with redis.lock(key, timeout=1, expire=300, nowait=True):
                return func(**kwargs)
        except UnableToGetLock:
            current_app.logger.warn('Unable to get lock for %s', key)

    return wrapped

from flask import current_app
from functools import wraps
from hashlib import md5

from changes.ext.redis import UnableToGetLock
from changes.config import redis


def lock(func):
    @wraps(func)
    def wrapped(**kwargs):
        key = '{0}:{1}:{2}'.format(
            func.__module__,
            func.__name__,
            md5(
                '&'.join('{0}={1}'.format(k, repr(v))
                for k, v in sorted(kwargs.iteritems()))
            ).hexdigest()
        )
        try:
            with redis.lock(key, timeout=1, expire=300, nowait=True):
                return func(**kwargs)
        except UnableToGetLock:
            current_app.logger.warn('Unable to get lock for %s', key)

    return wrapped

Use __module__ to make @lock unique
Use __module__ to make @lock unique

Summary: Fixes T49428.

Test Plan:
Hard to test on changes_dev because it can't run both handlers (no
place to send notifications to), but this seems simple enough...

Reviewers: armooo, kylec

Reviewed By: kylec

Subscribers: changesbot, mkedia, jukka, vishal

Maniphest Tasks: T49428

Differential Revision: https://tails.corp.dropbox.com/D122408

  from flask import current_app
  from functools import wraps
  from hashlib import md5
  
  from changes.ext.redis import UnableToGetLock
  from changes.config import redis
  
  
  def lock(func):
      @wraps(func)
      def wrapped(**kwargs):
-         key = '{0}:{1}'.format(
+         key = '{0}:{1}:{2}'.format(
+             func.__module__,
              func.__name__,
              md5(
                  '&'.join('{0}={1}'.format(k, repr(v))
                  for k, v in sorted(kwargs.iteritems()))
              ).hexdigest()
          )
          try:
              with redis.lock(key, timeout=1, expire=300, nowait=True):
                  return func(**kwargs)
          except UnableToGetLock:
              current_app.logger.warn('Unable to get lock for %s', key)
  
      return wrapped
  
Use __module__ to make @lock unique
## Code Before:
from flask import current_app
from functools import wraps
from hashlib import md5

from changes.ext.redis import UnableToGetLock
from changes.config import redis


def lock(func):
    @wraps(func)
    def wrapped(**kwargs):
        key = '{0}:{1}'.format(
            func.__name__,
            md5(
                '&'.join('{0}={1}'.format(k, repr(v))
                for k, v in sorted(kwargs.iteritems()))
            ).hexdigest()
        )
        try:
            with redis.lock(key, timeout=1, expire=300, nowait=True):
                return func(**kwargs)
        except UnableToGetLock:
            current_app.logger.warn('Unable to get lock for %s', key)

    return wrapped

## Instruction:
Use __module__ to make @lock unique
## Code After:
from flask import current_app
from functools import wraps
from hashlib import md5

from changes.ext.redis import UnableToGetLock
from changes.config import redis


def lock(func):
    @wraps(func)
    def wrapped(**kwargs):
        key = '{0}:{1}:{2}'.format(
            func.__module__,
            func.__name__,
            md5(
                '&'.join('{0}={1}'.format(k, repr(v))
                for k, v in sorted(kwargs.iteritems()))
            ).hexdigest()
        )
        try:
            with redis.lock(key, timeout=1, expire=300, nowait=True):
                return func(**kwargs)
        except UnableToGetLock:
            current_app.logger.warn('Unable to get lock for %s', key)

    return wrapped
