Skip to content
Snippets Groups Projects
how-to-use-sib-server.rst 14.15 KiB

How to use SiB server
####################

Once we've `install you server `__, your project is set up. We are now going to create an app, in other word your Django package.

.. seealso::
`Creating the poll apps `__ in Django project documentation.

Django packages
===============
Django packages are extensions for your projects that manage specifics datas you want. For example if you want to create Todo application, you are going to manage task datas.
You are going to define the shape of your datas in a model.

Here you have `a list of all the package available `__.

In what follows we will create our own. Let's start with this command :

.. code:: bash

python manage.py startapp our_package

Your architecture should look like this :

WARNING different structure car package externe
.. code:: bash
sibserver/
server/
__init__.py
settings.py
urls.py
wsgi.py
our_package/
migrations/
__init__.py
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
manage.py
packages.yml

1. Creating your first model
==========================

.. seealso::
`Creating models `__ in Django project documentation.

Create your django model inside a file sibserver/ourPackage/models.py

.. code:: python

from django.db import models
from djangoldp.models import Model

class Todo(Model):
name = models.CharField(max_length=255)
deadline = models.DateTimeField()

2. Add Meta class to your model
================================

Container path
--------------
Here you gonna configure the url within you'll get your container.
By default it will be “todos/” with an S for model called Todo.

.. warning::
We should define what is a container in more detail.

.. code:: python

class Todo(Model):
name = models.CharField(max_length=255)
deadline = models.DateTimeField()

class Meta:
container_path = "/my-path/"

.. note::
The container_path will be use to resolve instance iri and container iri In the future it could also be used to auto configure django router (e.g. urls.py)

Serialized fields
-----------------
You can configure field visibility (optional) : put in `serializer_fields` the list of field name you want to show.

.. code:: python

.. code:: python

from djangoldp.models import Model

class Todo(Model):
name = models.CharField(max_length=255)
deadline = models.DateTimeField()

class Meta:
serializer_fields = ['name']

Only ``name`` will be serialized

At this stage you can limit access to certain fields of models using
For example, if you have a model with a related field with type
**django.contrib.auth.models.User** you don’t want to show personal
details or password hashes.

E.g.

.. code:: python

from django.contrib.auth.models import User

User._meta.serializer_fields = ('username','first_name','last_name')

.. note::
This will be overridden if you explicitly set the fields=
parameter as an argument to LDPViewSet.urls(), and filtered if you set
the excludes= parameter.

auto_author
------------

This property allows to associate a model with the logged in user.

.. code:: python

from django.conf import settings

class MyModel(models.Model):
author_user = models.ForeignKey(settings.AUTH_USER_MODEL)

class Meta:
auto_author = 'author_user'

Now when an instance of ``MyModel`` is saved, its ``author_user``
property will be set to the current user.

nested_fields
--------------

list of ForeignKey, ManyToManyField, OneToOneField and their reverse
relations. When a field is listed in this parameter, a container will be
created inside each single element of the container.

In the following example, besides the urls ``/members/`` and
``/members//``, two other will be added to serve a container of the
skills of the member: ``/members//skills/`` and
``/members//skills//``

.. code:: python

._meta.nested_fields=["skills"]

User model requirements
======================

When implementing authentication in your own application, you have two
options:

- Using or extending
`DjangoLDP-Account `__,
a DjangoLDP package modelling federated users
- Using your own user model & defining the authentication behaviour
yourself

Please see the `Authentication
guide `__
for full information

If you’re going to use your own model then for federated login to work
your user model must extend ``DjangoLDP.Model``, or define a ``urlid``
field on the user model, for example:

.. code:: python

urlid = LDPUrlField(blank=True, null=True, unique=True)

If you don’t include this field, then all users will be treated as users
local to your instance

The ``urlid`` field is used to uniquely identify the user and is part of
the Linked Data Protocol standard. For local users it can be generated
at runtime, but for some resources which are from distant servers this
is required to be stored

3. Create a route for each model (out of the package)
===============================
https://git.startinblox.com/djangoldp-packages/risefor-lobbying/blob/master/risefor_lobbying/djangoldp_urls.py

Link to the django documentation.
to make custom view
Add a url in your urls.py:

.. code:: python

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from djangoldp.views import LDPViewSet
from django.conf.urls.static import static
from .models import Todo

urlpatterns = [
url(r'^', include('djangoldp.urls')),
url(r'^admin/', admin.site.urls), # Optional
]

This creates 2 routes for each Model, one for the list, and one with an
ID listing the detail of an object.

You could also only use this line in settings.py instead:

.. code:: python

ROOT_URLCONF = 'djangoldp.urls'

4. Set up your application
============================
In the settings.py file, add your application name at the beginning of the application list, and add the following lines

.. code:: python

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')
LDP_RDF_CONTEXT = 'https://cdn.happy-dev.fr/owl/hdcontext.jsonld'
DJANGOLDP_PACKAGES = []
SITE_URL = 'http://localhost:8000'
BASE_URL = SITE_URL

- ``LDP_RDF_CONTEXT`` tells DjangoLDP where our RDF
`ontology `__ is
defined, which will be returned as part of our views in the ‘context’
field. This is a web URL and you can visit the value to view the full
ontology online
- ``DJANGOLDP_PACKAGES`` defines which other `DjangoLDP
packages `__
we’re using in this installation
- ``SITE_URL`` is the URL serving the site,
e.g. ``https://example.com/``
- ``BASE_URL`` may be different from SITE_URL,
e.g. ``https://example.com/app/``

.. note::
More documentation about context is coming soon

5. Register your model in the Django administration
======================================================
You can also register your model for the django administration site in admin.py.

.. code:: python

from django.contrib import admin
from .models import Todo

admin.site.register(Todo)

You then need to have your WSGI server pointing on sibserver/sibserver/wsgi.py

6. Create a super user
========================
You will probably need to create a super user

.. code:: bash

$ ./manage.py createsuperuser

Makemigration migrate
http://127.0.0.1:8000/todos/

Permissions
===========

Django-Guardian is used by default to support object-level permissions.
Custom permissions can be added to your model using this attribute. See
the `Django-Guardian
documentation `__
for more information

permissions_classes
-------------------

This allows you to add permissions for anonymous, logged in user, author
… in the url: By default ``LDPPermissions`` is used. Specific permissin
classes can be developed to fit special needs.

anonymous_perms, user_perms, owner_perms
----------------------------------------

Those allow you to set permissions from your model’s meta.

You can give the following permission to them:

- ``view``
- ``add``
- ``change``
- ``control``
- ``delete``
- ``inherit``

With inherit, Users can herit from Anons. Also Owners can herit from
Users.

Eg. with this model Anons can view, Auths can add & Owners can edit &
delete.

Note that ``owner_perms`` need a ``owner_field`` meta that point the
field with owner user.

.. code:: python