incomplete support to user and project management

Change-Id: I9238ec321a292bb23c5c5797681819794dcfd0f0
Signed-off-by: lombardofr <lombardo@everyup.it>
diff --git a/projecthandler/models.py b/projecthandler/models.py
index 66fb7a5..79381f5 100644
--- a/projecthandler/models.py
+++ b/projecthandler/models.py
@@ -42,7 +42,7 @@
 
 
     """
-    owner = models.ForeignKey('sf_user.CustomUser', db_column='owner')
+    owner = models.ForeignKey('authosm.OsmUser', db_column='owner')
     name = models.CharField(max_length=20, default='')
     created_date = models.DateTimeField(default=timezone.now)
     updated_date = models.DateTimeField(default=timezone.now, blank=True, null=True)
@@ -287,47 +287,3 @@
 
     def get_overview_data(self):
         raise NotImplementedError
-
-class Repository(models.Model):
-    """ Repository
-    """
-    name = models.CharField(max_length=20, default='')
-    base_url = models.TextField(default='')
-    last_update = models.DateTimeField(default=timezone.now)
-    DIR_NAME = "/tmp/git_repo/"
-
-    def fetch_repository(self):
-        """
-        :return: git.remote.FetchInfo object
-        """
-        if os.path.isdir(self.DIR_NAME):
-            shutil.rmtree(self.DIR_NAME)
-
-        os.mkdir(self.DIR_NAME)
-        repo = git.Repo.init(self.DIR_NAME)
-        origin = repo.create_remote('origin', self.base_url)
-        origin.fetch()
-        fetch_info = origin.pull('master')[0]
-        return fetch_info
-
-    def push_repository(self, msg=None):
-        """
-        :param msg: Commit message
-        :return: git.remote.PushInfo object
-        """
-        repo = git.Repo.init(self.DIR_NAME)
-        origin = repo.remote('origin')
-        repo.git.add('--all')
-        repo.git.commit('-m \'[RDCL3D commit] ' + msg + '\'')
-        push_info = origin.push('master')[0]
-        return push_info
-
-    def to_json(self):
-        """
-        :return: JSON data of object
-        """
-        return {
-            'name': self.name,
-            'base_url': self.base_url.rstrip('\/'),
-            'last_update': self.last_update
-        }
diff --git a/projecthandler/osm_model.py b/projecthandler/osm_model.py
index f3daedf..1775797 100644
--- a/projecthandler/osm_model.py
+++ b/projecthandler/osm_model.py
@@ -1,5 +1,5 @@
 #
-#   Copyright 2017 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni
+#   Copyright 2018 EveryUP Srl
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
@@ -16,37 +16,24 @@
 
 from __future__ import unicode_literals
 
-import copy
 import json
 import os.path
 import yaml
 from lib.util import Util
 import logging
-from projecthandler.models import ProjectStateless
 
-from lib.osm.osm_parser import OsmParser
-from lib.osm.osm_rdcl_graph import OsmRdclGraph
 from lib.osm.osmclient.client import Client
 
 logging.basicConfig(level=logging.DEBUG)
 log = logging.getLogger('OsmModel.py')
 
 
-PATH_TO_SCHEMAS = 'lib/osm/schemas/'
-PATH_TO_DESCRIPTORS_TEMPLATES = 'lib/osm/descriptor_template'
-DESCRIPTOR_TEMPLATE_SUFFIX = '.json'
-GRAPH_MODEL_FULL_NAME = 'lib/TopologyModels/osm/osm.yaml'
-EXAMPLES_FOLDER = 'usecases/OSM/'
-
-
-class OsmProject(ProjectStateless):
+class OsmProject(object):
     """Osm Project class
-    The data model has the following descriptors:
-        # descrtiptor list in comment #
-
     """
 
-    def get_descriptors(self, type_descriptor):
+    @staticmethod
+    def get_descriptors( type_descriptor):
         """Returns all descriptors of a given type"""
         log.debug("Get %s descriptors", type_descriptor)
         try:
@@ -62,7 +49,8 @@
             result = {}
         return result
 
-    def get_descriptor(self, descriptor_id, type_descriptor):
+    @staticmethod
+    def get_descriptor( descriptor_id, type_descriptor):
         """Returns a specific descriptor"""
         try:
             client = Client()
@@ -79,93 +67,36 @@
 
         return result
 
-    @classmethod
-    def data_project_from_files(cls, request):
-
-        file_dict = {}
-        for my_key in request.FILES.keys():
-            file_dict[my_key] = request.FILES.getlist(my_key)
-
-        log.debug(file_dict)
-
-        data_project = OsmParser.importprojectfiles(file_dict)
-
-        return data_project
-
-    @classmethod
-    def data_project_from_example(cls, request):
-        osm_id = request.POST.get('example-osm-id', '')
-        data_project = OsmParser.importprojectdir(EXAMPLES_FOLDER + osm_id + '/JSON', 'yaml')
-        return data_project
-
-    @classmethod
-    def get_example_list(cls):
-        """Returns a list of directories, in each directory there is a project osm"""
-
-        path = EXAMPLES_FOLDER
-        dirs = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
-        return {'osm': dirs}
-
-    @classmethod
-    def get_new_descriptor(cls, descriptor_type, request_id):
-
-        json_template = cls.get_descriptor_template(descriptor_type)
-
-        return json_template
-
-    @classmethod
-    def get_descriptor_template(cls, type_descriptor):
-        """Returns a descriptor template for a given descriptor type"""
-
-        try:
-            schema = Util.loadjsonfile(os.path.join(PATH_TO_DESCRIPTORS_TEMPLATES, type_descriptor + DESCRIPTOR_TEMPLATE_SUFFIX))
-            return schema
-        except Exception as e:
-            log.exception(e)
-            return False
-
-    @classmethod
-    def get_clone_descriptor(cls, descriptor, type_descriptor, new_descriptor_id):
-        new_descriptor = copy.deepcopy(descriptor)
-
-        return new_descriptor
-
-    def get_type(self):
+    @staticmethod
+    def get_type():
         return "osm"
 
     def __str__(self):
         return self.name
 
-    def get_overview_data(self):
-        current_data = json.loads(self.data_project)
+    @staticmethod
+    def get_overview_data():
         client = Client()
         nsd = client.nsd_list()
         vnfd = client.vnfd_list()
         ns = client.ns_list()
         vnf = client.vnf_list()
         result = {
-            'owner': self.owner.__str__(),
-            'name': self.name,
-            'updated_date': self.updated_date.strftime('%Y-%m-%d %H:%M'),
-            'info': self.info,
+            'owner': '-',
+            'name': '-',
+            'updated_date': '-',
+            'info': '-',
             'type': 'osm',
             'nsd': len(nsd) if nsd else 0,
             'vnfd': len(vnfd) if vnfd else 0,
             'ns': len(ns) if ns else 0,
             'vnf': len(vnf) if vnf else 0,
-            #'validated': self.validated
         }
 
         return result
 
-    def get_graph_data_json_topology(self, descriptor_id):
-        rdcl_graph = OsmRdclGraph()
-        project = self.get_dataproject()
-        topology = rdcl_graph.build_graph_from_project(project,
-                                                     model=self.get_graph_model(GRAPH_MODEL_FULL_NAME))
-        return json.dumps(topology)
-
-    def create_descriptor(self, descriptor_name, type_descriptor, new_data, data_type, file_uploaded):
+    @staticmethod
+    def create_descriptor(descriptor_name, type_descriptor, new_data, data_type, file_uploaded):
         """Creates a descriptor of a given type from a json or yaml representation
 
         Returns the descriptor id or False
@@ -188,7 +119,8 @@
             result = False
         return result
 
-    def delete_descriptor(self, type_descriptor, descriptor_id):
+    @staticmethod
+    def delete_descriptor(type_descriptor, descriptor_id):
         log.debug('Delete descriptor')
         try:
             client = Client()
@@ -206,7 +138,8 @@
             result = False
         return result
 
-    def edit_descriptor(self, type_descriptor, descriptor_id, new_data, data_type):
+    @staticmethod
+    def edit_descriptor(type_descriptor, descriptor_id, new_data, data_type):
         log.debug("Edit descriptor")
         try:
             client = Client()
@@ -231,7 +164,8 @@
             result = False
         return result
 
-    def get_package_files_list(self, type_descriptor, descriptor_id):
+    @staticmethod
+    def get_package_files_list(type_descriptor, descriptor_id):
         try:
             client = Client()
             if type_descriptor == 'nsd':
@@ -248,9 +182,6 @@
         print result
         return result
 
-    def set_validated(self, value):
-        self.validated = True if value is not None and value == True else False
-
     def get_add_element(self, request):
         result = False
 
@@ -272,7 +203,8 @@
 
         return result
 
-    def create_ns(self, descriptor_type, descriptor_id, data_ns):
+    @staticmethod
+    def create_ns(descriptor_type, descriptor_id, data_ns):
         try:
             client = Client()
             if descriptor_type == 'nsd':
@@ -286,7 +218,8 @@
         print result
         return result
 
-    def download_pkg(self, project, descriptor_id, descriptor_type):
+    @staticmethod
+    def download_pkg(descriptor_id, descriptor_type):
         try:
             client = Client()
             if descriptor_type == 'nsd':
@@ -300,31 +233,4 @@
             log.exception(e)
             result = False
         print result
-        return result
-
-    def get_available_nodes(self, args):
-        """Returns all available node """
-        log.debug('get_available_nodes')
-        try:
-            result = []
-            #current_data = json.loads(self.data_project)
-            model_graph = self.get_graph_model(GRAPH_MODEL_FULL_NAME)
-            for node in model_graph['layer'][args['layer']]['nodes']:
-
-                current_data = {
-                    "id": node,
-                    "category_name": model_graph['nodes'][node]['label'],
-                    "types": [
-                        {
-                            "name": "generic",
-                            "id": node
-                        }
-                    ]
-                }
-                result.append(current_data)
-
-            #result = current_data[type_descriptor][descriptor_id]
-        except Exception as e:
-            log.debug(e)
-            result = []
-        return result
+        return result
\ No newline at end of file
diff --git a/projecthandler/template/project/osm/osm_project_descriptors.html b/projecthandler/template/project/osm/osm_project_descriptors.html
index 51dc3f5..99b6111 100644
--- a/projecthandler/template/project/osm/osm_project_descriptors.html
+++ b/projecthandler/template/project/osm/osm_project_descriptors.html
@@ -22,7 +22,7 @@
 
 {% block breadcrumb_body %}
   	{{ block.super }}
-    <li><a href="{% url 'projects:open_project' project_id=project_id %}">{{project_overview_data.name}}</a></li>
+    <li><a href="{% url 'projects:open_project' project_id=project_id %}">{{project_id}}</a></li>
     <li><a> {% if descriptor_type  %}
      {{ descriptor_type }}
   {% else%}
diff --git a/projecthandler/urls/project.py b/projecthandler/urls/project.py
index 452365a..2054656 100644
--- a/projecthandler/urls/project.py
+++ b/projecthandler/urls/project.py
@@ -20,36 +20,21 @@
 urlpatterns = [
     url(r'^list/', views.user_projects, name='projects_list'),
     url(r'^new/', views.create_new_project, name='new_project'),
-    url(r'^(?P<project_id>\d+)/$', views.open_project, name='open_project'),
-    url(r'^(?P<project_id>\d+)/sdn/', include('sdnctrlhandler.urls', namespace='sdns'), name='sdns_base'),
-    url(r'^(?P<project_id>\d+)/vims/', include('vimhandler.urls', namespace='vims'), name='vims_base'),
-    url(r'^(?P<project_id>\d+)/instances/', include('instancehandler.urls', namespace='instances'), name='instances_base'),
-    url(r'^(?P<project_id>\d+)/delete$', views.delete_project, name='delete_project'),
-    url(r'^(?P<project_id>\d+)/graph(/$)', views.graph, name='graph_view'),
-    url(r'^(?P<project_id>\d+)/graph/graph_data(/$)', views.graph_data, name='graph_data'),
-    url(r'^(?P<project_id>\d+)/graph/graph_data/(?P<descriptor_id>[-\w]+)(/$)', views.graph_data, name='graph_data'),
-    url(r'^(?P<project_id>\d+)/graph/positions$', views.graph_positions, name='graph_positions'),
-    url(r'^(?P<project_id>\d+)/graph/unusedvnf/(?P<nsd_id>\w+)(/$)', views.unused_vnf, name='unused_vnf'),
-    url(r'^(?P<project_id>\d+)/graph/addelement$', views.add_element, name='addelement'),
-    url(r'^(?P<project_id>\d+)/graph/overviewelement$', views.overviewelement, name='overviewelement'),
-    url(r'^(?P<project_id>\d+)/graph/addnodetovnffg', views.add_node_to_vnffg, name='addnodetovnffg'),
-    url(r'^(?P<project_id>\d+)/graph/removeelement$', views.remove_element, name='removeelement'),
-    url(r'^(?P<project_id>\d+)/graph/addlink$', views.add_link, name='addlink'),
-    url(r'^(?P<project_id>\d+)/graph/removelink$', views.remove_link, name='removelink'),
-    url(r'^(?P<project_id>\d+)/graph/availablenodes', views.get_available_nodes, name='get_available_nodes'),
-    url(r'^(?P<project_id>\d+)/descriptors/(?P<descriptor_type>\w+)/list$', views.show_descriptors, name='list_descriptors'),
-    url(r'^(?P<project_id>\d+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)(/$)',
+    url(r'^(?P<project_id>\w+)/$', views.open_project, name='open_project'),
+    url(r'^(?P<project_id>\w+)/sdn/', include('sdnctrlhandler.urls', namespace='sdns'), name='sdns_base'),
+    url(r'^(?P<project_id>\w+)/vims/', include('vimhandler.urls', namespace='vims'), name='vims_base'),
+    url(r'^(?P<project_id>\w+)/instances/', include('instancehandler.urls', namespace='instances'), name='instances_base'),
+    url(r'^(?P<project_id>\w+)/delete$', views.delete_project, name='delete_project'),
+    url(r'^(?P<project_id>\w+)/descriptors/(?P<descriptor_type>\w+)/list$', views.show_descriptors, name='list_descriptors'),
+    url(r'^(?P<project_id>\w+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)(/$)',
         views.edit_descriptor, name='edit_descriptor'),
-    url(r'^(?P<project_id>\d+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)/delete$',
+    url(r'^(?P<project_id>\w+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)/delete$',
         views.delete_descriptor,
         name='delete_descriptor'),
-    url(r'^(?P<project_id>\d+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)/clone$',
-        views.clone_descriptor,
-        name='clone_descriptor'),
-    url(r'^(?P<project_id>\d+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)/action/(?P<action_name>[-\w]+)',
+    url(r'^(?P<project_id>\w+)/descriptors/(?P<descriptor_type>\w+)/(?P<descriptor_id>[-\w]+)/action/(?P<action_name>[-\w]+)',
         views.custom_action,
         name='custom_action'),
-    url(r'^(?P<project_id>\d+)/descriptors/(?P<descriptor_type>\w+)/new$', views.new_descriptor,
+    url(r'^(?P<project_id>\w+)/descriptors/(?P<descriptor_type>\w+)/new$', views.new_descriptor,
         name='new_descriptor'),
 
 
diff --git a/projecthandler/views.py b/projecthandler/views.py
index a03ae44..16fb457 100644
--- a/projecthandler/views.py
+++ b/projecthandler/views.py
@@ -20,21 +20,12 @@
 from django.http import HttpResponse, JsonResponse
 from django.middleware.csrf import get_token
 from django.shortcuts import render, redirect
-from django.template.loader import render_to_string
 from lib.util import Util
-from sf_user.models import CustomUser
-import tarfile
-
-
 from projecthandler.osm_model import OsmProject
-from projecthandler.models import Project
-
-
-Project.add_project_type('osm', OsmProject)
+from lib.osm.osmclient.client import Client
 
 
 
-from projecthandler.models import Repository
 
 @login_required
 def home(request):
@@ -43,81 +34,14 @@
 
 @login_required
 def create_new_project(request):
-    if request.method == 'POST':
-        error_msgs = []
-        user = CustomUser.objects.get(id=request.user.id)
-        name = request.POST.get('name', 'WithoutName')
-        info = request.POST.get('info', ' ')
-        type = request.POST.get('type', '')
-        start_from = request.POST.get('startfrom', 'scratch')
-
-        project_types = Project.get_project_types()
-        if type in project_types:
-            project_class = project_types[type]
-
-        else:
-            # FIXME this error is not handled
-            error_msgs.append('Project type undefined.')
-            return render(request, 'error.html',
-                          {'error_msg': 'Error creating new project, project type undefined. Please retry.'})
-
-        try:
-
-            if start_from == 'scratch':
-                print 'from scratch'
-                data_project = {}
-
-            elif start_from == 'files':
-                print 'from files'
-                data_project = project_class.data_project_from_files(request)
-
-            elif start_from == 'example':
-                print 'from example'
-                data_project = project_class.data_project_from_example(request)
-
-            project = project_class.create_project(name, user, False, info, data_project)
-            # print project.get_dataproject()
-
-
-        except Exception as e:
-            print 'Error creating ' + type + ' project! Please retry.'
-            print e
-            return render(request, 'error.html', {'error_msg': 'Error creating ' + type + ' project! Please retry.'})
-        return redirect('projects:open_project', project_id=project.id)
-
-    elif request.method == 'GET':
-        csrf_token_value = get_token(request)
-        result = {}
-        data_type_selector = [{
-            'id': '-1',
-            'text': 'Select an option'
-        }]
-        type_example_files = {}
-        type_container_template = ''
-        project_types = Project.get_project_types()
-        print "project_types", project_types.keys()
-        for type in project_types:
-            project_class = project_types[type]
-            type_example_files.update(project_class.get_example_list())
-            data_type_selector.append({
-                'id': type,
-                'text': type,
-                'value': type
-            })
-            type_container_template += render_to_string(type + '/' + type + '_new_project.html')
-
-        result.update({'type_example_files': json.dumps(type_example_files)})
-        result.update({'data_type_selector': json.dumps(data_type_selector)})
-        result.update({'type_container_template': type_container_template})
-        result.update({'csrf_token': csrf_token_value})
-        return render(request, 'new_project.html', result)
+    return render(request, 'home.html', {})
 
 
 @login_required
 def user_projects(request):
     csrf_token_value = get_token(request)
-    user = CustomUser.objects.get(id=request.user.id)
-    projects = Project.objects.filter(owner=user).select_subclasses()
+    user = request.user
+    projects = user.get_projects()
 
     return render(request, 'projectlist.html', {
         'projects': list(projects),
@@ -128,11 +52,25 @@
 @login_required
 def open_project(request, project_id=None):
     try:
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        project_overview = projects[0].get_overview_data()
-        prj_token = project_overview['type']
-        print request.COOKIES.keys()
-        return render(request, prj_token + '/' + prj_token + '_project_details.html',
+        user = request.user
+        client = Client()
+        nsd = client.nsd_list()
+        vnfd = client.vnfd_list()
+        ns = client.ns_list()
+        vnf = client.vnf_list()
+        project_overview = {
+            'owner': user.username,
+            'name': project_id,
+            'updated_date': '-',
+            'created_date': '-',
+            'info': '-',
+            'type': 'osm',
+            'nsd': len(nsd) if nsd else 0,
+            'vnfd': len(vnfd) if vnfd else 0,
+            'ns': len(ns) if ns else 0,
+            'vnf': len(vnf) if vnf else 0,
+        }
+        return render(request, 'osm/osm_project_details.html',
                       {'project_overview': project_overview, 'project_id': project_id})
 
     except Exception as e:
@@ -145,7 +83,7 @@
     if request.method == 'POST':
 
         try:
-            Project.objects.filter(id=project_id).delete()
+            ##TODO delete project
             return redirect('projects:projects_list')
         except Exception as e:
             print e
@@ -153,13 +91,8 @@
 
     elif request.method == 'GET':
         try:
-            projects = Project.objects.filter(id=project_id).select_subclasses()
-            project_overview = projects[0].get_overview_data()
-            prj_token = project_overview['type']
-            #                 example: 'etsi/etsi_project_delete.html'
-            print  prj_token + '/' + prj_token + '_project_delete.html', project_overview['name']
-            return render(request, prj_token + '/' + prj_token + '_project_delete.html',
-                          {'project_id': project_id, 'project_name': project_overview['name']})
+            return render(request, 'osm/osm_project_delete.html',
+                          {'project_id': project_id, 'project_name': project_id})
 
         except Exception as e:
             print e
@@ -169,62 +102,49 @@
 @login_required
 def show_descriptors(request, project_id=None, descriptor_type=None):
     csrf_token_value = get_token(request)
-    projects = Project.objects.filter(id=project_id).select_subclasses()
-    project_overview = projects[0].get_overview_data()
-    prj_token = project_overview['type']
 
-    url = prj_token + '/' + prj_token + '_project_descriptors.html'
+    client = Client()
+    try:
+        if descriptor_type == 'nsd':
+            descriptors = client.nsd_list()
+
+        elif descriptor_type == 'vnfd':
+            descriptors = client.vnfd_list()
+    except Exception as e:
+        descriptors = []
+
+    url = 'osm/osm_project_descriptors.html'
     return __response_handler(request, {
-        'descriptors': projects[0].get_descriptors(descriptor_type),
+        'descriptors': descriptors,
         'project_id': project_id,
-        'project_type': prj_token,
-        'project_overview_data': project_overview,
+        'project_type': 'osm',
         "csrf_token_value": csrf_token_value,
         'descriptor_type': descriptor_type
     },url)
 
 
 @login_required
-def graph(request, project_id=None):
-    if request.method == 'GET':
-        csrf_token_value = get_token(request)
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        project_overview = projects[0].get_overview_data()
-        prj_token = project_overview['type']
-        # example : 'etsi/project_graph.html'
-        return render(request, prj_token + '/project_graph.html', {
-            'project_id': project_id,
-            'project_overview_data': projects[0].get_overview_data(),
-            'collapsed_sidebar': False
-        })
-
-
-@login_required
-def graph_data(request, project_id=None, descriptor_id=None):
-    print 'graph_data', project_id, descriptor_id
-    projects = Project.objects.filter(id=project_id).select_subclasses()
-    project_overview = projects[0].get_overview_data()
-    # data = projects[0].get_overview_data()
-    prj_token = project_overview['type']
-
-    topology = projects[0].get_graph_data_json_topology(descriptor_id)
-    response = HttpResponse(topology, content_type="application/json")
-    response["Access-Control-Allow-Origin"] = "*"
-
-    return response
-
-
-@login_required
 def delete_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None):
     csrf_token_value = get_token(request)
-    projects = Project.objects.filter(id=project_id).select_subclasses()
-    result = projects[0].delete_descriptor(descriptor_type, descriptor_id)
-    project_overview = projects[0].get_overview_data()
+
+    try:
+        client = Client()
+        if descriptor_type == 'nsd':
+            result = client.nsd_delete(descriptor_id)
+        elif descriptor_type == 'vnfd':
+            result = client.vnfd_delete(descriptor_id)
+
+        else:
+            return False
+
+    except Exception as e:
+        result = False
+    project_overview = OsmProject.get_overview_data()
     prj_token = project_overview['type']
     page = prj_token + '/' + prj_token + '_project_descriptors.html'
 
     return render(request, page, {
-        'descriptors': projects[0].get_descriptors(descriptor_type),
+        'descriptors': OsmProject.get_descriptors(descriptor_type),
         'project_id': project_id,
         'project_overview_data': project_overview,
         "csrf_token_value": csrf_token_value,
@@ -236,31 +156,9 @@
 
 
 @login_required
-def clone_descriptor(request, project_id=None, descriptor_type=None, descriptor_id=None):
-    csrf_token_value = get_token(request)
-    projects = Project.objects.filter(id=project_id).select_subclasses()
-    new_id = request.GET.get('newid', '')
-    result = projects[0].clone_descriptor(descriptor_type, descriptor_id, new_id)
-    project_overview = projects[0].get_overview_data()
-    prj_token = project_overview['type']
-    page = prj_token + '/' + prj_token + '_project_descriptors.html'
-
-    return render(request, page, {
-        'descriptors': projects[0].get_descriptors(descriptor_type),
-        'project_id': project_id,
-        'project_overview_data': project_overview,
-        "csrf_token_value": csrf_token_value,
-        'descriptor_type': descriptor_type,
-        'alert_message': {
-            'success': result,
-            'message': "Cloned!" if result else 'Error in cloning'}
-    })
-
-
-@login_required
 def new_descriptor(request, project_id=None, descriptor_type=None):
-    projects = Project.objects.filter(id=project_id).select_subclasses()
-    project_overview = projects[0].get_overview_data()
+
+    project_overview = OsmProject.get_overview_data()
     prj_token = project_overview['type']
     page = prj_token + '/descriptor/descriptor_new.html'
     if request.method == 'GET':
@@ -280,17 +178,17 @@
             text = file_uploaded.read()
             data_type = file_uploaded.name.split(".")[-1]
             desc_name = file_uploaded.name.split(".")[0]
-            result = projects[0].create_descriptor(desc_name, descriptor_type, text, data_type, file_uploaded)
+            result = OsmProject.create_descriptor(desc_name, descriptor_type, text, data_type, file_uploaded)
         else:
             text = request.POST.get('text')
             desc_name = request.POST.get('id')
-            result = projects[0].create_descriptor(desc_name, descriptor_type, text, data_type)
+            result = OsmProject.create_descriptor(desc_name, descriptor_type, text, data_type)
 
 
         response_data = {
             'project_id': project_id,
             'descriptor_type': descriptor_type,
-            'project_overview_data': projects[0].get_overview_data(),
+            'project_overview_data':OsmProject.get_overview_data(),
             'descriptor_id': result,
             'alert_message': {
                 'success': True if result != False else False,
@@ -306,8 +204,7 @@
 def edit_descriptor(request, project_id=None, descriptor_id=None, descriptor_type=None):
     if request.method == 'POST':
         print "edit_descriptor"
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].edit_descriptor(descriptor_type, descriptor_id, request.POST.get('text'),
+        result = OsmProject.edit_descriptor(descriptor_type, descriptor_id, request.POST.get('text'),
                                              request.POST.get('type'))
         response_data = {
             'project_id': project_id,
@@ -324,13 +221,12 @@
 
     elif request.method == 'GET':
         csrf_token_value = get_token(request)
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        project_overview = projects[0].get_overview_data()
+        project_overview = OsmProject.get_overview_data()
         print project_overview
         prj_token = project_overview['type']
         page = prj_token + '/descriptor/descriptor_view.html'
 
-        descriptor = projects[0].get_descriptor(descriptor_id, descriptor_type)
+        descriptor = OsmProject.get_descriptor(descriptor_id, descriptor_type)
 
         descriptor_string_json = json.dumps(descriptor)
         descriptor_string_yaml = Util.json2yaml(descriptor)
@@ -338,130 +234,12 @@
         return render(request, page, {
             'project_id': project_id,
             'descriptor_id': descriptor_id,
-            'project_overview_data': projects[0].get_overview_data(),
+            'project_overview_data': OsmProject.get_overview_data(),
             'descriptor_type': descriptor_type,
             'descriptor_strings': {'descriptor_string_yaml': descriptor_string_yaml,
                                    'descriptor_string_json': descriptor_string_json}})
 
 
-@login_required
-def graph_positions(request, project_id=None):
-    if request.method == 'POST':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].edit_graph_positions(json.loads(request.POST.get('positions')))
-        status_code = 200 if result else 500
-        response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-
-@login_required
-def add_element(request, project_id=None):
-    if request.method == 'POST':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].get_add_element(request)
-
-        status_code = 200 if result else 500
-        response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-
-@login_required
-def remove_element(request, project_id=None):
-    if request.method == 'POST':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].get_remove_element(request)
-
-        status_code = 200 if result else 500
-        response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-
-@login_required
-def add_link(request, project_id=None):
-    if request.method == 'POST':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].get_add_link(request)
-
-        status_code = 200 if result else 500
-        response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-
-@login_required
-def remove_link(request, project_id=None):
-    if request.method == 'POST':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].get_remove_link(request)
-
-        status_code = 200 if result else 500
-        response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-@login_required
-def get_available_nodes(request, project_id=None):
-    if request.method == 'GET':
-        csrf_token_value = get_token(request)
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        print "get_available_nodes", request.GET.dict()
-        result = projects[0].get_available_nodes(request.GET.dict())
-        status_code = 500 if result == None else 200
-        print json.dumps(result)
-        response = HttpResponse(json.dumps(result), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-@login_required
-def overviewelement(request, project_id=None):
-    if request.method == 'GET':
-        result = {}
-        error_msg = None
-        try:
-            projects = Project.objects.filter(id=project_id).select_subclasses()
-            project = projects[0]
-            parameters = request.GET.dict()
-            print "parameters", parameters
-            result = project.get_node_overview(**parameters)
-        except Exception as e:
-            error_msg = str(e)
-
-        if error_msg is not None:
-            return JsonResponse({'error': {'error_msg': str(error_msg)}})
-
-        return JsonResponse({'node_overview': result})
-
-# ETSI specific method #
-@login_required
-def add_node_to_vnffg(request, project_id=None):
-    print "add_node_to_vnffg"  # TODO log
-    if request.method == 'POST':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].add_node_to_vnffg(request)
-
-        status_code = 200 if result else 500
-        response = HttpResponse(json.dumps({}), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-
-@login_required
-def unused_vnf(request, project_id=None, nsd_id=None):
-    if request.method == 'GET':
-        print 'in method unused_vnf : ', project_id, nsd_id  # TODO log
-        projects = Project.objects.filter(id=project_id).select_subclasses()
-        result = projects[0].get_unused_vnf(nsd_id)
-        status_code = 500 if result == None else 200
-        response = HttpResponse(json.dumps(result), content_type="application/json", status=status_code)
-        response["Access-Control-Allow-Origin"] = "*"
-        return response
-
-# end ETSI specific method #
-
-
 # OSM specific method #
 def get_package_files_list(request, project_id, project, descriptor_id, descriptor_type):
     files_list = []
@@ -475,8 +253,8 @@
     return __response_handler(request, result)
 
 
-def download_pkg(request, project_id, project, descriptor_id, descriptor_type):
-    tar_pkg = project.download_pkg(project, descriptor_id, descriptor_type)
+def download_pkg(request, project_id, descriptor_id, descriptor_type):
+    tar_pkg = OsmProject.download_pkg(descriptor_id, descriptor_type)
 
     response = HttpResponse(content_type="application/tgz")
     response["Content-Disposition"] = "attachment; filename=osm_export.tar.gz"
@@ -511,9 +289,8 @@
 @login_required
 def custom_action(request, project_id=None, descriptor_id=None, descriptor_type=None, action_name=None):
     if request.method == 'GET':
-        projects = Project.objects.filter(id=project_id).select_subclasses()
         print "Custom action: " + action_name
-        return globals()[action_name](request, project_id, projects[0], descriptor_id, descriptor_type)
+        return globals()[action_name](request, project_id, descriptor_id, descriptor_type)
 
 
 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):