django-easy-drf 0.1.0
A package to create boring stuff of django rest framework
Requires Python: >=3.6

# django-easy-drf

A package that makes for you the repetitive work of creating Serializers, ViewSets and URLs for django rest framework.

## Installation
On a virtualenv run:
```
pip install django-easy-drf
```

## Usage
On the same virtualenv, you will have *easy-drf* command available, so run:
```
easy-drf
```
This command will create serializers.py, views.py and urls.py files on the same directory, with all the classes created.

Note: requires that a file called models.py exists on the current directory.

Suppose you have a models.py file with the following content:
```python
from django.db import models

class ExampleModel(models.Model):
    some_field = models.IntegerField()
    some_other_field = models.DecimalField(decimal_places=2, max_digits=10)
    third_field = models.DecimalField(decimal_places=2, max_digits=10)
```

The resulting serializers.py will be like this:
```python
from rest_framework import serializers
from .models import ExampleModel

class ExampleModelSerializer(serializers.ModelSerializer):

    class Meta():
        model = ExampleModel
        fields = ('id', 'some_field', 'some_other_field', 'third_field')
```

The resulting views.py will be like this:
```python
from rest_framework import viewsets
from .serializers import ExampleModelSerializer
from .models import ExampleModel

class ExampleModelViewSet(viewsets.ModelViewSet):
    queryset = ExampleModel.objects.all()
    serializer_class = ExampleModelSerializer
```

The resulting urls.py will be like this:
```python
from rest_framework.routers import DefaultRouter
from .views import ExampleModelViewSet
router = DefaultRouter()
router.register('example-model', ExampleModelViewSet, basename='example-model')
urlpatterns = router.urls
```

#### Forcing creation
If you want to avoid command prompt, you can force it:
```
easy-drf --force
```
or less verbose:
```
easy-drf -f
```
#### Creating only one file
Sometimes you don't need all files (views, serializers and urls) so you can specify which ones should be created. Options are:
- 's' for serializers.py
- 'v' for views.py
- 'u' for urls.py

For example, this command will create serializers.py and views.py
```
easy-drf --files s v
```
If you don't specify --files argument, all files will be created.


#### Creating only one model
Sometimes you don't need all models, so you can specify which ones should be created. 

Suppose you have a models.py file with the following content:
```python
from django.db import models

class ExampleModel(models.Model):
    some_field = models.IntegerField()
    some_other_field = models.DecimalField(decimal_places=2, max_digits=10)
    third_field = models.DecimalField(decimal_places=2, max_digits=10)


class DogModel(models.Model):
    name = models.DateTimeField(verbose_name='Horario de evento')
    age = models.TextField(default='Titulo evento')
    is_good_boy = models.BooleanField()
```

But you know that *only DogModel will be serialized*, so you can create a serializer only for this model, running:
```
easy-drf --files s -m DogModel
```

The resulting serializers.py file will be like this:
```python
from rest_framework import serializers
from .models import DogModel

class DogModelSerializer(serializers.ModelSerializer):

    class Meta():
        model = DogModel
        fields = ('id', 'some_field', 'some_other_field', 'third_field')
```

You can use -m or --models and specify some models:
```
easy-drf --files s --models DogModel ExampleModel
```

##### Append by default
If any of the named files exist on the current directory, the result will be appended to their content.
Suppose you have a models.py file with the following content:
```python
from django.db import models

class ExampleModel(models.Model):
    some_field = models.IntegerField()
    some_other_field = models.DecimalField(decimal_places=2, max_digits=10)
    third_field = models.DecimalField(decimal_places=2, max_digits=10)

class DogModel(models.Model):
    name = models.DateTimeField(verbose_name='Horario de evento')
    age = models.TextField(default='Titulo evento')
    is_good_boy = models.BooleanField()
```

And you have a serializers.py file like this:
```python
from rest_framework import serializers
from .models import ExampleModel

class ExampleModelSerializer(serializers.ModelSerializer):

    class Meta():
        model = ExampleModel
        fields = ('id', 'some_field', 'some_other_field', 'third_field')
```

Then you run 
```
easy-drf -m DogModel --files s
```

The resulting serializers.py file will be like this:
```python
from rest_framework import serializers
from .models import ExampleModel, DogModel

class ExampleModelSerializer(serializers.ModelSerializer):

    class Meta():
        model = ExampleModel
        fields = ('id', 'some_field', 'some_other_field', 'third_field')

class DogModelSerializer(serializers.ModelSerializer):

    class Meta():
        model = DogModel
        fields = ('id', 'some_field', 'some_other_field', 'third_field')
```
The effect of the command was:
- In the second line of the serializers.py file, DogModel was added as an import.
- DogModelSerializer is created at the bottom of the file, keeping the original file's content

*This is the default behavior, but an option to rewrite the entire file will be added soon.*

#### Getting help
For help, type:
```
easy-drf --help
```
or less verbose:
```
easy-drf -h
```
This command will list the available cli options.

#### Future developments
- [x] Warn users about files override.
- [x] Allow users to force script without prompt.
- [x] Allow users to create just one specific file.
- [x] Allow users to create just one model.
- [ ] Allow users to override default append behavior.
- [ ] Allow users to specify different models file.
- [ ] Allow users to specify different results file names.


### Contributing
If you have an idea or an implementation, let me know by submitting an issue or a PR.