's tools, utilities, etc. we use across projects for Django
pip install django-ckc# settings.py
INSTALLED_APPS = (
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.staticfiles",
# ... add ckc
"ckc",
)$ docker build -t django-ckc . && docker run django-ckc pytestMake your models have a deleted bool set when they are deleted instead of actuallying
being deleted. Uses a model manager SoftDeleteModelManager to keep them hidden.
A DRF field for writing via PK and reading via a serializer. Useful for when you want to connect 2 models together and immediately display to the user some useful information.
For example, if you had an Order model with LineItem objects pointing to it, it may be
useful to create a new line item via order PK and return back the complete order with
new totals and other calculations:
class LineItemUpdateSerializer(serializers.ModelSerializer):
order = PrimaryKeyWriteSerializerReadField(
queryset=Order.objects.all(),
read_serializer=OrderDetailSerializer
)
class Meta:
model = LineItem
fields = ["id", "order", "product"]POST data for adding product #123 to order #5 would look like
// REQUEST
{"order": 5, "product": 123}"}
// RESPONSE
{"order": {"total_amount": "$1,000.00"}, "product": 123}This will automatically set YourModel.created_by to request.user. To override which
attribute the user is written to, add a user_field to your classes Meta information
class YourModel(models.Model):
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
class MySerializer(DefaultCreatedByMixin, ModelSerializer):
class Meta:
model = YourModelHelps generate geo points in Factory Boy factories.
# factories.py
class SomeLocationFactory(DjangoModelFactory):
location = factory.Faker('geo_point', country_code='US')
class Meta:
model = SomeLocation
# test_whatever.py
from django.contrib.gis.geos import Point
class WhateverTest(TestCase):
def test_something(self):
SomeLocationFactory() # random location
SomeLocationFactory(location=Point(x=60, y=60)) # specified locationGet a Slack webhook URL and set SLACK_WEBHOOK_URL env var. You can also set DJANGO_SLACK_LOG_LEVEL
with info, warning, etc.
Modify your Celery settings:
# Let our slack logger handle celery stuff
CELERY_WORKER_HIJACK_ROOT_LOGGER = FalseExample LOGGING configuration that turns on Slack logging if SLACK_WEBHOOK_URL env var is found:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'colored': {
'()': 'colorlog.ColoredFormatter',
'format': "%(log_color)s%(levelname)-8s%(reset)s %(white)s%(message)s",
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'colored',
},
},
'loggers': {
'': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
},
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
'propagate': False,
}
},
}
SLACK_WEBHOOK_URL = os.getenv('SLACK_WEBHOOK_URL', '')
if SLACK_WEBHOOK_URL:
LOGGING['handlers']['slack'] = {
'class': 'ckc.logging.CkcSlackHandler',
'level': os.getenv('DJANGO_SLACK_LOG_LEVEL', 'ERROR'),
}
LOGGING['loggers']['django']['handlers'] = ['console', 'slack']
LOGGING['loggers']['']['handlers'] = ['console', 'slack']A little helper that when raised returns a JSON response to the user with a snackbar message. This message is automatically rendered as a snackbar by Skeletor.
# views.py
from ckc.exceptions import SnackbarError
class TestExceptionsViewSet(APIView):
def get(self, request, *args, **kwargs):
# This will return {"snackbar_message": "Something went wrong"}
raise SnackbarError("Something went wrong")| command | description |
|---|---|
upload_file <source> <destination> |
uses django-storages settings to upload a file |