Skip to content

4 Django API

Andre edited this page Jun 3, 2023 · 5 revisions

How are we going to seed the data?

First I'll explain how we will fetch intra API to seed the following Fields:

  • Skills
  • Projects
  • Cursus
  • CursusSkills (The skills that belong to cursus) (The various cursus where a skill belongs)
  • ProjectCursus (The projects that belong to a cursus) (The various cursus where a project belongs)

On the last Part I'll explain how the user will get updated.


Intra has the following useful endpoints for updating our db


Skills

GET /v2/skills
Return all the skills

GET /v2/cursus/:cursus_id/skills
Return all the skills of the given Cursus

GET /v2/skills/:id
Get a skill


Cursus

GET /v2/cursus
Return all the cursus

GET /v2/cursus/:id
Get a cursus


Projects

GET /v2/projects
Return all the projects

GET /v2/cursus/:cursus_id/projects
Return all the projects of the given Cursus

GET /v2/projects/:project_id/projects
Return all the projects of the given Project

GET /v2/me/projects
Return all the projects for the current resource owner

ProjectUsers

GET /v2/projects/:project_id/projects_users
Return all the projects users of the given Project

GET /v2/users/:user_id/projects_users
Return all the projects users of the given User

GET /v2/projects_users
Return all the projects users

GET /v2/projects_users/:id
Get a projects user


Thought Process

(Intra 'element' in the following description stands for: [Cursus, Skills, Projects & Users])

It makes sense to update each intra 'element' individually with an async function.


Skills details
curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/skills?sort=name&per_page=20&page=1"
[
  {
    "id": 14,
    "slug": "adaptation-creativity",
    "name": "Adaptation & creativity",
    "created_at": "2014-12-04T14:38:04.450Z"
  },
  {
    "id": 1,
    "slug": "algorithms-ai",
    "name": "Algorithms & AI",
    "created_at": "2014-11-02T17:49:33.624Z"
  },
  {
    "id": 19,
    "slug": "basics",
    "name": "Basics",
    "created_at": "2015-04-20T13:59:08.396Z"
  },
  {
    "id": 69,
    "slug": "bio-technologies",
    "name": "Bio-Technologies",
    "created_at": "2022-05-07T16:40:25.256Z"
  },
  {
    "id": 70,
    "slug": "blockchain",
    "name": "Blockchain",
    "created_at": "2022-05-07T16:42:05.879Z"
  },
  {
    "id": 16,
    "slug": "company-experience",
    "name": "Company experience",
    "created_at": "2014-12-04T14:38:32.898Z"
  },
  {
    "id": 12,
    "slug": "db-data",
    "name": "DB & Data",
    "created_at": "2014-12-04T14:37:43.724Z"
  },
  {
    "id": 8,
    "slug": "functional-programming",
    "name": "Functional programming",
    "created_at": "2014-12-04T14:35:45.063Z"
  },
  {
    "id": 66,
    "slug": "go",
    "name": "Go",
    "created_at": "2021-07-01T06:19:54.493Z"
  },
  {
    "id": 5,
    "slug": "graphics",
    "name": "Graphics",
    "created_at": "2014-11-19T20:34:22.011Z"
  },
  {
    "id": 7,
    "slug": "group-interpersonal",
    "name": "Group & interpersonal",
    "created_at": "2014-12-04T14:35:38.149Z"
  },
  {
    "id": 2,
    "slug": "imperative-programming",
    "name": "Imperative programming",
    "created_at": "2014-11-02T17:50:29.828Z"
  },
  {
    "id": 62,
    "slug": "motion-design",
    "name": "Motion Design",
    "created_at": "2016-08-23T14:32:32.191Z"
  },
  {
    "id": 10,
    "slug": "network-system-administration",
    "name": "Network & system administration",
    "created_at": "2014-12-04T14:37:00.051Z"
  },
  {
    "id": 17,
    "slug": "object-oriented-programming",
    "name": "Object-oriented programming",
    "created_at": "2014-12-04T14:39:14.614Z"
  },
  {
    "id": 13,
    "slug": "organization",
    "name": "Organization",
    "created_at": "2014-12-04T14:37:54.557Z"
  },
  {
    "id": 9,
    "slug": "parallel-computing",
    "name": "Parallel computing",
    "created_at": "2014-12-04T14:35:54.566Z"
  },
  {
    "id": 53,
    "slug": "python",
    "name": "Python",
    "created_at": "2015-11-04T10:58:42.165Z"
  },
  {
    "id": 3,
    "slug": "rigor",
    "name": "Rigor",
    "created_at": "2014-11-02T18:23:09.799Z"
  },
  {
    "id": 25,
    "slug": "ruby",
    "name": "Ruby",
    "created_at": "2015-09-20T13:28:00.757Z"
  },
  {
    "id": 11,
    "slug": "security",
    "name": "Security",
    "created_at": "2014-12-04T14:37:09.684Z"
  },
  {
    "id": 67,
    "slug": "self-awareness",
    "name": "Self-awareness",
    "created_at": "2021-08-31T10:27:45.690Z"
  },
  {
    "id": 26,
    "slug": "shell",
    "name": "Shell",
    "created_at": "2015-09-21T12:32:18.200Z"
  },
  {
    "id": 15,
    "slug": "technology-integration",
    "name": "Technology integration",
    "created_at": "2014-12-04T14:38:20.646Z"
  },
  {
    "id": 68,
    "slug": "testing",
    "name": "Testing",
    "created_at": "2022-01-26T11:13:34.668Z"
  },
  {
    "id": 4,
    "slug": "unix",
    "name": "Unix",
    "created_at": "2014-11-12T20:47:27.596Z"
  },
  {
    "id": 6,
    "slug": "web",
    "name": "Web",
    "created_at": "2014-12-04T14:34:41.155Z"
  },
  {
    "id": 63,
    "slug": "written-communication",
    "name": "Written Communication",
    "created_at": "2019-10-04T09:37:28.127Z"
  }
]
Cursus details
curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/cursus?sort=id&per_page=20&page=1"
[
  {
    "id": 1,
    "created_at": "2014-11-02T16:43:38.480Z",
    "name": "42",
    "slug": "42",
    "kind": "main_deprecated"
  },
  {
    "id": 3,
    "created_at": "2015-04-20T07:39:49.050Z",
    "name": "Discovery Piscine",
    "slug": "discovery-piscine",
    "kind": "professional_training"
  },
  {
    "id": 4,
    "created_at": "2015-05-01T17:46:08.433Z",
    "name": "Piscine C",
    "slug": "piscine-c",
    "kind": "piscine_deprecated"
  },
  {
    "id": 5,
    "created_at": "2015-09-20T13:27:03.918Z",
    "name": "42partnerships",
    "slug": "42partnerships",
    "kind": "external"
  },
  {
    "id": 6,
    "created_at": "2015-09-21T12:36:09.128Z",
    "name": "Piscine C décloisonnée",
    "slug": "piscine-c-decloisonnee",
    "kind": "piscine_deprecated"
  },
  {
    "id": 7,
    "created_at": "2015-09-21T12:40:13.452Z",
    "name": "Piscine C à distance",
    "slug": "piscine-c-a-distance",
    "kind": "piscine_deprecated"
  },
  {
    "id": 8,
    "created_at": "2015-09-22T11:35:20.216Z",
    "name": "WeThinkCode_",
    "slug": "wethinkcode_",
    "kind": "main_deprecated"
  },
  {
    "id": 9,
    "created_at": "2015-11-04T10:58:13.979Z",
    "name": "C Piscine",
    "slug": "c-piscine",
    "kind": "piscine"
  },
  {
    "id": 10,
    "created_at": "2015-11-12T16:35:19.549Z",
    "name": "Formation Pole Emploi",
    "slug": "formation-pole-emploi",
    "kind": "main_deprecated"
  },
  {
    "id": 11,
    "created_at": "2015-12-08T11:59:17.803Z",
    "name": "BootCamp",
    "slug": "bootcamp",
    "kind": "piscine_deprecated"
  },
  {
    "id": 12,
    "created_at": "2016-08-23T14:37:59.752Z",
    "name": "Créa",
    "slug": "crea",
    "kind": "external"
  },
  {
    "id": 13,
    "created_at": "2017-02-01T14:25:42.300Z",
    "name": "42 Labs",
    "slug": "42-labs",
    "kind": "external_deprecated"
  },
  {
    "id": 14,
    "created_at": "2017-05-15T09:53:41.742Z",
    "name": "Technical Interview",
    "slug": "technical-interview",
    "kind": "test"
  },
  {
    "id": 15,
    "created_at": "2017-05-29T22:01:22.923Z",
    "name": "X-Mansion",
    "slug": "x-mansion",
    "kind": "external_deprecated"
  },
  {
    "id": 16,
    "created_at": "2017-06-06T21:13:39.178Z",
    "name": "X-Mansion-Namido",
    "slug": "x-mansion-namido",
    "kind": "external_deprecated"
  },
  {
    "id": 17,
    "created_at": "2017-08-28T23:27:49.646Z",
    "name": "H2S",
    "slug": "h2s",
    "kind": "external_deprecated"
  },
  {
    "id": 18,
    "created_at": "2017-12-15T22:31:21.361Z",
    "name": "Starfleet",
    "slug": "starfleet",
    "kind": "external_deprecated"
  },
  {
    "id": 19,
    "created_at": "2018-03-27T22:33:03.213Z",
    "name": "Atlantis",
    "slug": "atlantis",
    "kind": "external"
  },
  {
    "id": 20,
    "created_at": "2018-09-08T18:34:56.909Z",
    "name": "Boost",
    "slug": "boost",
    "kind": "external"
  },
  {
    "id": 21,
    "created_at": "2019-07-29T08:45:17.896Z",
    "name": "42cursus",
    "slug": "42cursus",
    "kind": "main"
  }
]
Projects details
curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/projects?sort=name&per_page=20&page=1"
[
  {
    "id": 458,
    "name": "00",
    "slug": "piscine-c-decloisonnee-pide-jour-09-00",
    "difficulty": 0,
    "parent": {
      "name": "Jour 09",
      "id": 482,
      "slug": "piscine-c-decloisonnee-jour-09",
      "url": "https://projects.intra.42.fr/piscine-c-decloisonnee-jour-09/mine"
    },
    "children": [],
    "attachments": [],
    "created_at": "2015-09-21T14:43:38.230Z",
    "updated_at": "2023-05-16T08:20:52.939Z",
    "exam": false,
    "git_id": null,
    "repository": null,
    "recommendation": "forbidden",
    "cursus": [
      {
        "id": 6,
        "created_at": "2015-09-21T12:36:09.128Z",
        "name": "Piscine C décloisonnée",
        "slug": "piscine-c-decloisonnee",
        "kind": "piscine_deprecated"
      }
    ],
    "campus": [
      {
        "id": 1,
        "name": "Paris",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-06-01T08:48:03.513Z"
        },
        "users_count": 25946,
        "vogsphere_id": 1,
        "country": "France",
        "address": "96, boulevard Bessières",
        "zip": "75017",
        "city": "Paris",
        "website": "http://www.42.fr/",
        "facebook": "https://facebook.com/42born2code",
        "twitter": "https://twitter.com/42born2code",
        "active": true,
        "public": true,
        "email_extension": "42.fr",
        "default_hidden_phone": false
      }
    ],
    "videos": [],
    "project_sessions": [
      {
        "id": 192,
        "solo": true,
        "begin_at": "2015-10-22T15:00:00.000Z",
        "end_at": "2015-10-22T16:00:00.000Z",
        "estimate_time": "7 days",
        "difficulty": 0,
        "objectives": null,
        "description": null,
        "duration_days": null,
        "terminating_after": null,
        "project_id": 458,
        "campus_id": null,
        "cursus_id": null,
        "created_at": "2016-02-15T15:38:05.328Z",
        "updated_at": "2016-12-07T14:51:00.265Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [],
        "uploads": [],
        "team_behaviour": "user",
        "commit": null
      }
    ]
  }
]

After creating/updating all the intra 'elements' we can update their relations with each other (await for async functions).

To create relations between x and y (either x was added or removed from an element y)


ProjectCursus details

Given the following Cursus:

{
  "id":21,
  "created_at":"2019-07-29T08:45:17.896Z",
  "name":"42cursus",
  "slug":"42cursus",
  "kind":"main"
}

We can find out the projects belonging to the cursus by using it's id (#21)

curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/cursus/21/projects

This would return a very big list of projects which belong to cursus #21, where not all projects might have been updated, that is why we should use the range to only update the projects which changed: In the example we check the range: [2023-06-02,2023-06-03] The real implementation should use the cursus updated_at and the current time.

curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/cursus/21/projects?&range%5Bupdated_at%5D=2023-06-02,2023-06-03&&per_page=10&page=1"

[square brackets need to be URL encoded as mentioned on RFC 3986]

[
  {
    "id": 1457,
    "name": "multilayer-perceptron",
    "slug": "42cursus-multilayer-perceptron",
    "difficulty": 9450,
    "parent": null,
    "children": [],
    "attachments": [],
    "created_at": "2019-09-23T12:06:55.308Z",
    "updated_at": "2023-06-02T10:17:45.414Z",
    "exam": false,
    "git_id": 1,
    "repository": "145",
    "recommendation": "forbidden",
    "cursus": [
      {
        "id": 53,
        "created_at": "2021-10-20T07:14:44.406Z",
        "name": "42.zip",
        "slug": "42-zip",
        "kind": "main"
      },
      {
        "id": 21,
        "created_at": "2019-07-29T08:45:17.896Z",
        "name": "42cursus",
        "slug": "42cursus",
        "kind": "main"
      }
    ],
    "campus": [
      {
        "id": 1,
        "name": "Paris",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-06-01T08:48:03.513Z"
        },
        "users_count": 25946,
        "vogsphere_id": 1,
        "country": "France",
        "address": "96, boulevard Bessières",
        "zip": "75017",
        "city": "Paris",
        "website": "http://www.42.fr/",
        "facebook": "https://facebook.com/42born2code",
        "twitter": "https://twitter.com/42born2code",
        "active": true,
        "public": true,
        "email_extension": "42.fr",
        "default_hidden_phone": false
      }
    ],
    "videos": [],
    "project_sessions": [
      {
        "id": 9882,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 47,
        "cursus_id": 21,
        "created_at": "2023-04-13T12:02:27.115Z",
        "updated_at": "2023-04-13T12:59:43.676Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 22853,
            "correction_number": 3,
            "is_primary": true
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "494da8eeb17df4b9e727c5d02fb8df8b87503f1f"
      },
      {
        "id": 9736,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 12,
        "cursus_id": 21,
        "created_at": "2023-03-30T13:21:22.509Z",
        "updated_at": "2023-06-02T10:17:45.335Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23970,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 22495,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 9622,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 26,
        "cursus_id": 21,
        "created_at": "2023-03-15T02:09:41.733Z",
        "updated_at": "2023-05-08T09:29:30.328Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23358,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 21960,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 4758,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 14,
        "cursus_id": 21,
        "created_at": "2020-09-03T16:16:50.844Z",
        "updated_at": "2023-05-02T10:56:26.266Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23283,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 23050,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 9826,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 3501,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 3364,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 3149,
            "correction_number": 5,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 7139,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 1,
        "cursus_id": 21,
        "created_at": "2022-02-03T14:43:16.963Z",
        "updated_at": "2023-05-03T09:39:54.032Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23297,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 17148,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 14895,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 11296,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 6628,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 1,
        "cursus_id": 53,
        "created_at": "2021-10-20T13:22:59.805Z",
        "updated_at": "2023-05-03T09:40:12.776Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 17859,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 23298,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 14894,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 8987,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 8941,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 39,
        "cursus_id": 21,
        "created_at": "2022-11-17T13:44:20.896Z",
        "updated_at": "2022-11-17T13:44:25.043Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 18900,
            "correction_number": 3,
            "is_primary": true
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "494da8eeb17df4b9e727c5d02fb8df8b87503f1f"
      },
      {
        "id": 8845,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 9,
        "cursus_id": 21,
        "created_at": "2022-11-15T12:54:54.832Z",
        "updated_at": "2022-11-15T12:55:07.514Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 18758,
            "correction_number": 3,
            "is_primary": true
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "494da8eeb17df4b9e727c5d02fb8df8b87503f1f"
      },
      {
        "id": 8480,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 13,
        "cursus_id": 21,
        "created_at": "2022-09-30T15:12:29.140Z",
        "updated_at": "2023-05-08T10:25:23.538Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23365,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 17943,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 17298,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 8117,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 25,
        "cursus_id": 21,
        "created_at": "2022-07-18T14:57:33.141Z",
        "updated_at": "2023-01-31T15:40:51.979Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 20340,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 15436,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "494da8eeb17df4b9e727c5d02fb8df8b87503f1f"
      },
      {
        "id": 7541,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": 41,
        "cursus_id": 21,
        "created_at": "2022-03-19T15:33:58.968Z",
        "updated_at": "2023-05-08T08:29:20.503Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 16934,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 23351,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 14419,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 13146,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      },
      {
        "id": 3499,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "Math",
          "Neural Network"
        ],
        "description": "Subject created by the 42AI association. This project is an introduction to artificial neural networks thanks to the implementation of a multilayer perceptron.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1457,
        "campus_id": null,
        "cursus_id": null,
        "created_at": "2019-09-23T12:06:55.318Z",
        "updated_at": "2023-05-31T19:41:45.178Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23935,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 16660,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 14893,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 8276,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 3459,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 3348,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 3347,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 2592,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 2353,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 2277,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 1545,
            "correction_number": 5,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "73eecf410d1c6df1cc8f3b9e488e66b763612c8f"
      }
    ]
  },
  {
    "id": 1460,
    "name": "total-perspective-vortex",
    "slug": "42cursus-total-perspective-vortex",
    "difficulty": 9450,
    "parent": null,
    "children": [],
    "attachments": [],
    "created_at": "2019-09-23T12:07:06.935Z",
    "updated_at": "2023-06-02T10:19:25.878Z",
    "exam": false,
    "git_id": 1,
    "repository": "331",
    "recommendation": "forbidden",
    "cursus": [
      {
        "id": 53,
        "created_at": "2021-10-20T07:14:44.406Z",
        "name": "42.zip",
        "slug": "42-zip",
        "kind": "main"
      },
      {
        "id": 21,
        "created_at": "2019-07-29T08:45:17.896Z",
        "name": "42cursus",
        "slug": "42cursus",
        "kind": "main"
      }
    ],
    "campus": [
      {
        "id": 64,
        "name": "Singapore",
        "time_zone": "Asia/Singapore",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-15T08:14:48.451Z"
        },
        "users_count": 12,
        "vogsphere_id": 56,
        "country": "Singapore",
        "address": "8 Somapah Rd",
        "zip": "487372",
        "city": "Singapore",
        "website": "https://www.42.fr/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42singapore.sg",
        "default_hidden_phone": false
      },
      {
        "id": 61,
        "name": "Belo Horizonte",
        "time_zone": "America/Sao_Paulo",
        "language": {
          "id": 17,
          "name": "Brazilian Portuguese",
          "identifier": "pt_br",
          "created_at": "2020-12-10T14:15:00.994Z",
          "updated_at": "2023-05-10T11:51:55.439Z"
        },
        "users_count": 11,
        "vogsphere_id": null,
        "country": "Brazil",
        "address": "- No address yet -",
        "zip": "30000",
        "city": "Belo Horizonte",
        "website": "https://42bh.org.br",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42bh.org.br",
        "default_hidden_phone": false
      },
      {
        "id": 62,
        "name": "Le Havre",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-25T07:13:15.909Z"
        },
        "users_count": 204,
        "vogsphere_id": 54,
        "country": "France",
        "address": "Cité Numérique - 20 Quai Frissard - Le Havre - 76600 - France",
        "zip": "76600",
        "city": "Le Havre",
        "website": "https://42lehavre.fr",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42lehavre.fr",
        "default_hidden_phone": false
      },
      {
        "id": 53,
        "name": "Vienna",
        "time_zone": "Europe/Vienna",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-22T12:19:35.449Z"
        },
        "users_count": 509,
        "vogsphere_id": 49,
        "country": "Austria",
        "address": "Muthgasse 26/1",
        "zip": "1190",
        "city": "Vienna",
        "website": "https://www.42vienna.com",
        "facebook": "https://www.facebook.com/42vienna",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42vienna.com",
        "default_hidden_phone": false
      },
      {
        "id": 59,
        "name": "Luxembourg",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-15T08:14:51.541Z"
        },
        "users_count": 14,
        "vogsphere_id": null,
        "country": "Luxembourg",
        "address": "- no address yet - ",
        "zip": "1000",
        "city": "Luxembourg",
        "website": "https://42luxembourg.lu",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42luxembourg.lu",
        "default_hidden_phone": false
      },
      {
        "id": 60,
        "name": "Perpignan",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-15T08:14:51.541Z"
        },
        "users_count": 324,
        "vogsphere_id": 53,
        "country": "France",
        "address": "5, Rue Pierre Curie - Les Dames de France",
        "zip": "66000",
        "city": "Perpignan",
        "website": "https://42perpignan.fr",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42perpignan.fr",
        "default_hidden_phone": false
      },
      {
        "id": 13,
        "name": "Helsinki",
        "time_zone": "Europe/Helsinki",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-25T08:47:43.953Z"
        },
        "users_count": 1174,
        "vogsphere_id": 13,
        "country": "Finland",
        "address": "Haapaniemenkatu 5",
        "zip": "00530",
        "city": "Helsinki",
        "website": "https://www.hive.fi/",
        "facebook": "https://www.facebook.com/HiveHelsinki",
        "twitter": "https://twitter.com/hivehelsinki",
        "active": true,
        "public": true,
        "email_extension": "hive.fi",
        "default_hidden_phone": false
      },
      {
        "id": 56,
        "name": "Prague",
        "time_zone": "Europe/Prague",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-06-02T13:20:26.141Z"
        },
        "users_count": 377,
        "vogsphere_id": 52,
        "country": "Czech Republic",
        "address": "AFI CITY TOWER Kolbenova 1021/9 Praha 9 - Vysočany",
        "zip": "19000",
        "city": "Prague",
        "website": "https://42prague.com",
        "facebook": "https://www.facebook.com/42Prague",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42prague.com",
        "default_hidden_phone": false
      },
      {
        "id": 57,
        "name": "London",
        "time_zone": "Europe/London",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-30T11:17:48.516Z"
        },
        "users_count": 202,
        "vogsphere_id": 51,
        "country": "United Kingdom",
        "address": "30 Millbank - 5th & 6th Floors",
        "zip": "SW1P 4DU",
        "city": "London",
        "website": "https://42london.com",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42london.com",
        "default_hidden_phone": true
      },
      {
        "id": 58,
        "name": "Porto",
        "time_zone": "Europe/Lisbon",
        "language": {
          "id": 9,
          "name": "Portuguese",
          "identifier": "pt",
          "created_at": "2019-01-29T15:17:48.227Z",
          "updated_at": "2023-05-30T11:17:56.217Z"
        },
        "users_count": 836,
        "vogsphere_id": 50,
        "country": "Portugal",
        "address": "Av. dos Aliados n⁰ 322/324, 3⁰ Piso",
        "zip": "4000-407",
        "city": "Porto",
        "website": "https://42porto.com",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42porto.com",
        "default_hidden_phone": false
      },
      {
        "id": 31,
        "name": "Angouleme",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-17T09:25:52.690Z"
        },
        "users_count": 381,
        "vogsphere_id": 41,
        "country": "France",
        "address": "49-51 Boulevard Besson-Ney",
        "zip": "16000",
        "city": "Angoulême",
        "website": "https://www.42angouleme.fr/",
        "facebook": "https://facebook.com/ecole42angouleme/",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42angouleme.fr",
        "default_hidden_phone": false
      },
      {
        "id": 37,
        "name": "Malaga",
        "time_zone": "Europe/Madrid",
        "language": {
          "id": 11,
          "name": "Spanish",
          "identifier": "es",
          "created_at": "2019-08-09T15:14:32.544Z",
          "updated_at": "2023-06-02T10:34:10.296Z"
        },
        "users_count": 2575,
        "vogsphere_id": 45,
        "country": "Spain",
        "address": "malaga street",
        "zip": "29000",
        "city": "Malaga",
        "website": "http://www.42malaga.com",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42malaga.com",
        "default_hidden_phone": false
      },
      {
        "id": 51,
        "name": "Berlin",
        "time_zone": "Europe/Berlin",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-06-01T08:48:01.929Z"
        },
        "users_count": 740,
        "vogsphere_id": 48,
        "country": "Germany",
        "address": "Harzer Strasse 39",
        "zip": "12059",
        "city": "Berlin",
        "website": "http://42berlin.de/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42berlin.de",
        "default_hidden_phone": false
      },
      {
        "id": 48,
        "name": "Mulhouse",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-06-02T04:28:44.605Z"
        },
        "users_count": 484,
        "vogsphere_id": 39,
        "country": "France",
        "address": "30 Rue François Spoerry",
        "zip": "68100",
        "city": "Mulhouse",
        "website": "https://42mulhouse.fr",
        "facebook": "https://www.facebook.com/42Mulhouse",
        "twitter": "https://twitter.com/42MulhouseGE",
        "active": true,
        "public": true,
        "email_extension": "42mulhouse.fr",
        "default_hidden_phone": false
      },
      {
        "id": 54,
        "name": "42-test",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-06-01T08:48:03.513Z"
        },
        "users_count": 42,
        "vogsphere_id": 55,
        "country": "France",
        "address": "96 Bd Bessières",
        "zip": "75017",
        "city": "Paris",
        "website": "http://42campus.org",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": false,
        "email_extension": "42campus.org",
        "default_hidden_phone": false
      },
      {
        "id": 55,
        "name": "Tétouan",
        "time_zone": "Africa/Casablanca",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-22T08:51:04.542Z"
        },
        "users_count": 334,
        "vogsphere_id": 44,
        "country": "Morocco",
        "address": "Parc Tétouan Shore, CP93150 , Martil, Tétouan",
        "zip": "93000",
        "city": "Tétouan",
        "website": "https://1337.ma",
        "facebook": "",
        "twitter": "https://twitter.com/1337FIL",
        "active": true,
        "public": true,
        "email_extension": "1337.ma",
        "default_hidden_phone": false
      },
      {
        "id": 52,
        "name": "Florence",
        "time_zone": "Europe/Rome",
        "language": {
          "id": 16,
          "name": "Italian",
          "identifier": "it",
          "created_at": "2020-03-12T13:30:39.859Z",
          "updated_at": "2023-05-15T13:09:29.207Z"
        },
        "users_count": 575,
        "vogsphere_id": 46,
        "country": "Italy",
        "address": "Via del Tiratoio, 1",
        "zip": "50124",
        "city": "Firenze",
        "website": "https://www.42firenze.it",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42firenze.it",
        "default_hidden_phone": true
      },
      {
        "id": 46,
        "name": "Barcelona",
        "time_zone": "Europe/Madrid",
        "language": {
          "id": 11,
          "name": "Spanish",
          "identifier": "es",
          "created_at": "2019-08-09T15:14:32.544Z",
          "updated_at": "2023-05-16T12:30:11.239Z"
        },
        "users_count": 1975,
        "vogsphere_id": 38,
        "country": "Spain",
        "address": "Parc Tecnològic de Barcelona Activa, Carrer Albert Einstein",
        "zip": "08042",
        "city": "Barcelona",
        "website": "https://www.42barcelona.com",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42barcelona.com",
        "default_hidden_phone": true
      },
      {
        "id": 49,
        "name": "Istanbul",
        "time_zone": "Europe/Istanbul",
        "language": {
          "id": 18,
          "name": "Turkish",
          "identifier": "tr",
          "created_at": "2021-08-20T10:50:01.782Z",
          "updated_at": "2023-05-15T08:15:11.778Z"
        },
        "users_count": 2689,
        "vogsphere_id": 36,
        "country": "Turkey",
        "address": "Ayazağa Mah. Azerbaycan Cad. Vadistanbul İş Blokları 2B Blok Kat 3 Sarıyer",
        "zip": "34000",
        "city": "Istanbul",
        "website": "http://www.42istanbul.com.tr",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42istanbul.com.tr",
        "default_hidden_phone": false
      },
      {
        "id": 34,
        "name": "Kuala Lumpur",
        "time_zone": "Asia/Kuala_Lumpur",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-25T08:47:43.953Z"
        },
        "users_count": 939,
        "vogsphere_id": 26,
        "country": "Malaysia",
        "address": "Sunway FutureX",
        "zip": "47500",
        "city": "Kuala Lumpur",
        "website": "42kl.edu.my",
        "facebook": "https://www.facebook.com/42kualalumpur/",
        "twitter": "https://twitter.com/42kualalumpur",
        "active": true,
        "public": true,
        "email_extension": "42kl.edu.my",
        "default_hidden_phone": false
      },
      {
        "id": 50,
        "name": "Kocaeli",
        "time_zone": "Europe/Istanbul",
        "language": {
          "id": 18,
          "name": "Turkish",
          "identifier": "tr",
          "created_at": "2021-08-20T10:50:01.782Z",
          "updated_at": "2023-05-31T19:39:44.626Z"
        },
        "users_count": 1674,
        "vogsphere_id": 37,
        "country": "Turkey",
        "address": "Muallimköy Mahallesi, Deniz Cd. No:143-5, 41400 Gebze/Kocaeli",
        "zip": "41000",
        "city": "Kocaeli",
        "website": "http://42kocaeli.com.tr",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42kocaeli.com.tr",
        "default_hidden_phone": false
      },
      {
        "id": 47,
        "name": "Lausanne",
        "time_zone": "Europe/Zurich",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-06-01T08:48:03.513Z"
        },
        "users_count": 894,
        "vogsphere_id": 35,
        "country": "Switzerland",
        "address": "64 Rue de Lausanne",
        "zip": "1020",
        "city": "Renens",
        "website": "https://42lausanne.ch/",
        "facebook": "https://www.facebook.com/42Lausanne",
        "twitter": "https://twitter.com/42lausanne",
        "active": true,
        "public": true,
        "email_extension": "42lausanne.ch",
        "default_hidden_phone": true
      },
      {
        "id": 44,
        "name": "Wolfsburg",
        "time_zone": "Europe/Berlin",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-22T12:19:35.449Z"
        },
        "users_count": 2656,
        "vogsphere_id": 29,
        "country": "Germany",
        "address": "Porschestraße 2c",
        "zip": "38440",
        "city": "Wolfsburg",
        "website": "http://42wolfsburg.de/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42wolfsburg.de",
        "default_hidden_phone": false
      },
      {
        "id": 40,
        "name": "Urduliz",
        "time_zone": "Europe/Madrid",
        "language": {
          "id": 11,
          "name": "Spanish",
          "identifier": "es",
          "created_at": "2019-08-09T15:14:32.544Z",
          "updated_at": "2023-05-15T08:15:00.587Z"
        },
        "users_count": 1206,
        "vogsphere_id": 32,
        "country": "Spain",
        "address": "Aita Gotzon Kalea 37",
        "zip": "48610",
        "city": "Urduliz",
        "website": "https://42urduliz.com/",
        "facebook": "",
        "twitter": "https://twitter.com/42UrdulizFTef",
        "active": true,
        "public": true,
        "email_extension": "42urduliz.com",
        "default_hidden_phone": true
      },
      {
        "id": 33,
        "name": "Bangkok",
        "time_zone": "Asia/Bangkok",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-06-02T04:28:42.881Z"
        },
        "users_count": 2474,
        "vogsphere_id": 31,
        "country": "Thailand",
        "address": "1 Thanon Chalong Krung, Lat Krabang",
        "zip": "10520",
        "city": "Bangkok",
        "website": "https://www.42bangkok.com/",
        "facebook": "https://www.facebook.com/42Bangkok/",
        "twitter": "https://twitter.com/42bangkok",
        "active": true,
        "public": true,
        "email_extension": "42bangkok.com",
        "default_hidden_phone": false
      },
      {
        "id": 36,
        "name": "Adelaide",
        "time_zone": "Australia/Adelaide",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-15T08:14:48.451Z"
        },
        "users_count": 990,
        "vogsphere_id": 33,
        "country": "Australia",
        "address": "Level 2 and 3 - 24 Pitt St",
        "zip": "5000",
        "city": "Adelaide",
        "website": "http://www.42adel.org.au",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42adel.org.au",
        "default_hidden_phone": false
      },
      {
        "id": 25,
        "name": "Quebec",
        "time_zone": "America/New_York",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-15T13:10:51.214Z"
        },
        "users_count": 639,
        "vogsphere_id": 27,
        "country": "Canada",
        "address": "330, St-Vallier Est, bureau 300",
        "zip": "G1K 9C5",
        "city": "Québec",
        "website": "42quebec.com",
        "facebook": "https://www.facebook.com/42quebec/",
        "twitter": "https://twitter.com/42_quebec",
        "active": true,
        "public": true,
        "email_extension": "42quebec.com",
        "default_hidden_phone": true
      },
      {
        "id": 15,
        "name": "Cape-Town",
        "time_zone": "Africa/Johannesburg",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-15T08:14:48.451Z"
        },
        "users_count": 845,
        "vogsphere_id": 12,
        "country": "South Africa",
        "address": "Portswood, Workshop17, Dock Rd, V & A Waterfront",
        "zip": "8002",
        "city": "Cape-Town",
        "website": "https://www.wethinkcode.co.za/",
        "facebook": "https://www.facebook.com/wethinkcode/",
        "twitter": "https://twitter.com/wethinkcode",
        "active": false,
        "public": false,
        "email_extension": "wethinkcode.co.za",
        "default_hidden_phone": false
      },
      {
        "id": 41,
        "name": "Nice",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-15T08:14:51.541Z"
        },
        "users_count": 943,
        "vogsphere_id": 23,
        "country": "France",
        "address": "61 Avenue Simone Veil",
        "zip": "06200",
        "city": "Nice",
        "website": "https://www.42nice.fr/",
        "facebook": "https://www.facebook.com/42nice",
        "twitter": "https://twitter.com/42nicesud",
        "active": true,
        "public": true,
        "email_extension": "42nice.fr",
        "default_hidden_phone": true
      },
      {
        "id": 39,
        "name": "Heilbronn",
        "time_zone": "Europe/Berlin",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-06-01T08:48:01.929Z"
        },
        "users_count": 1809,
        "vogsphere_id": 28,
        "country": "Germany",
        "address": "Weipertstr 8 - 10",
        "zip": "74076",
        "city": "Heilbronn",
        "website": "https://42heilbronn.de/",
        "facebook": "https://www.facebook.com/42heilbronn",
        "twitter": "https://twitter.com/42Heilbronn",
        "active": true,
        "public": true,
        "email_extension": "42heilbronn.de",
        "default_hidden_phone": false
      },
      {
        "id": 43,
        "name": "Abu Dhabi",
        "time_zone": "Asia/Dubai",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-25T08:47:43.953Z"
        },
        "users_count": 1689,
        "vogsphere_id": 30,
        "country": "United Arab Emirates",
        "address": "Mina Zayed, Warehouse District ",
        "zip": "00000",
        "city": "Abu Dhabi",
        "website": "https://42abudhabi.ae/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42abudhabi.ae",
        "default_hidden_phone": false
      },
      {
        "id": 42,
        "name": "42Network",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-31T12:21:49.817Z"
        },
        "users_count": 201,
        "vogsphere_id": 43,
        "country": "France",
        "address": "96 boulevard Bessières",
        "zip": "75017",
        "city": "PARIS",
        "website": "http://42network.org/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": false,
        "email_extension": "42network.org",
        "default_hidden_phone": false
      },
      {
        "id": 38,
        "name": "Lisboa",
        "time_zone": "Europe/Lisbon",
        "language": {
          "id": 9,
          "name": "Portuguese",
          "identifier": "pt",
          "created_at": "2019-01-29T15:17:48.227Z",
          "updated_at": "2023-05-30T11:17:56.217Z"
        },
        "users_count": 2001,
        "vogsphere_id": 25,
        "country": "Portugal",
        "address": "Rua Neves Ferreira, 13B",
        "zip": "1170-273",
        "city": "Lisboa",
        "website": "http://www.42lisboa.com",
        "facebook": "https://www.facebook.com/42-Lisboa-100970235020298/",
        "twitter": "https://twitter.com/42lisboa",
        "active": true,
        "public": true,
        "email_extension": "42lisboa.com",
        "default_hidden_phone": false
      },
      {
        "id": 30,
        "name": "Rome",
        "time_zone": "Europe/Rome",
        "language": {
          "id": 16,
          "name": "Italian",
          "identifier": "it",
          "created_at": "2020-03-12T13:30:39.859Z",
          "updated_at": "2023-05-23T16:23:50.613Z"
        },
        "users_count": 1865,
        "vogsphere_id": 24,
        "country": "Italy",
        "address": "Via Marsala 29H Termini train station",
        "zip": "00185",
        "city": "Roma",
        "website": "https://www.42roma.it",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42roma.it",
        "default_hidden_phone": true
      },
      {
        "id": 17,
        "name": "Moscow",
        "time_zone": "Europe/Moscow",
        "language": {
          "id": 6,
          "name": "Russian",
          "identifier": "ru",
          "created_at": "2018-06-08T10:49:26.608Z",
          "updated_at": "2018-06-08T10:49:26.708Z"
        },
        "users_count": 8804,
        "vogsphere_id": 7,
        "country": "Russian Federation",
        "address": "Vyatskaya 27, business park \"Factoria\"",
        "zip": "127015",
        "city": "Moscow",
        "website": "21-school.ru",
        "facebook": "https://www.facebook.com/21coding",
        "twitter": "https://twitter.com/21coding",
        "active": true,
        "public": true,
        "email_extension": "21-school.ru",
        "default_hidden_phone": false
      },
      {
        "id": 32,
        "name": "Yerevan",
        "time_zone": "Asia/Yerevan",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-15T09:39:24.979Z"
        },
        "users_count": 1652,
        "vogsphere_id": 22,
        "country": "Armenia",
        "address": "16 Halabyan St",
        "zip": "0038",
        "city": "Yerevan",
        "website": "https://42yerevan.am/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42yerevan.am",
        "default_hidden_phone": false
      },
      {
        "id": 28,
        "name": "Rio de Janeiro",
        "time_zone": "America/Sao_Paulo",
        "language": {
          "id": 9,
          "name": "Portuguese",
          "identifier": "pt",
          "created_at": "2019-01-29T15:17:48.227Z",
          "updated_at": "2023-05-25T07:13:18.797Z"
        },
        "users_count": 679,
        "vogsphere_id": 40,
        "country": "Brazil",
        "address": "Via Binario do Porto, 299 / 4th floor",
        "zip": "20000-000",
        "city": "Rio de Janeiro",
        "website": "https://42.rio",
        "facebook": "",
        "twitter": "@Escola42Rio",
        "active": true,
        "public": true,
        "email_extension": "42.rio",
        "default_hidden_phone": false
      },
      {
        "id": 7,
        "name": "Fremont",
        "time_zone": "America/Tijuana",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-15T08:14:48.451Z"
        },
        "users_count": 18213,
        "vogsphere_id": 2,
        "country": "United States",
        "address": "6 600 Dumbarton Circle",
        "zip": "94555",
        "city": "Fremont",
        "website": "https://www.42.us.org/",
        "facebook": "https://www.facebook.com/42SiliconValley",
        "twitter": "https://twitter.com/42SiliconValley",
        "active": false,
        "public": false,
        "email_extension": "42.us.org",
        "default_hidden_phone": false
      },
      {
        "id": 23,
        "name": "Kazan",
        "time_zone": "Europe/Moscow",
        "language": {
          "id": 6,
          "name": "Russian",
          "identifier": "ru",
          "created_at": "2018-06-08T10:49:26.608Z",
          "updated_at": "2018-06-08T10:49:26.708Z"
        },
        "users_count": 3828,
        "vogsphere_id": 18,
        "country": "Russian Federation",
        "address": "Spartakovskaya, 2b2",
        "zip": "420000",
        "city": "Kazan",
        "website": "21-school.ru",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "21-school.ru",
        "default_hidden_phone": false
      },
      {
        "id": 29,
        "name": "Seoul",
        "time_zone": "Asia/Seoul",
        "language": {
          "id": 14,
          "name": "Korean",
          "identifier": "ko",
          "created_at": "2020-01-08T10:56:47.481Z",
          "updated_at": "2023-05-30T10:48:07.371Z"
        },
        "users_count": 5551,
        "vogsphere_id": 19,
        "country": "Korea, Republic of",
        "address": "Gaepo Digital Innovation Park, 416, Gaepo-ro, Gangnam-gu,",
        "zip": "06324",
        "city": "Seoul",
        "website": "https://www.42seoul.kr",
        "facebook": "https://www.facebook.com/inno.aca/  ",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42seoul.kr",
        "default_hidden_phone": false
      },
      {
        "id": 9,
        "name": "Lyon",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-19T23:51:43.089Z"
        },
        "users_count": 2631,
        "vogsphere_id": 4,
        "country": "France",
        "address": "Campus Région du Numérique – 78 route de Paris",
        "zip": "69260",
        "city": "Charbonnières-les-Bains",
        "website": "https://www.42lyon.fr/",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42lyon.fr",
        "default_hidden_phone": true
      },
      {
        "id": 20,
        "name": "São-Paulo",
        "time_zone": "America/Sao_Paulo",
        "language": {
          "id": 17,
          "name": "Brazilian Portuguese",
          "identifier": "pt_br",
          "created_at": "2020-12-10T14:15:00.994Z",
          "updated_at": "2023-05-23T16:23:43.959Z"
        },
        "users_count": 3038,
        "vogsphere_id": 14,
        "country": "Brazil",
        "address": "Rua Aspicuelta, 422, cj. 71A",
        "zip": "05433-010",
        "city": "São Paulo",
        "website": "https://42sp.org.br",
        "facebook": "",
        "twitter": "",
        "active": true,
        "public": true,
        "email_extension": "42sp.org.br",
        "default_hidden_phone": false
      },
      {
        "id": 26,
        "name": "Tokyo",
        "time_zone": "Asia/Tokyo",
        "language": {
          "id": 13,
          "name": "Japanese",
          "identifier": "ja",
          "created_at": "2019-11-15T13:34:10.581Z",
          "updated_at": "2023-05-31T19:39:47.272Z"
        },
        "users_count": 4869,
        "vogsphere_id": 17,
        "country": "Japan",
        "address": "Sumitomo Fudosan Roppongi Grand Tower 3-2-1 Roppongi Minato-ku reception: 24F",
        "zip": "106-6224",
        "city": "Tokyo",
        "website": "https://42tokyo.jp",
        "facebook": "https://www.facebook.com/42tokyo/",
        "twitter": "https://twitter.com/42_tokyo",
        "active": true,
        "public": true,
        "email_extension": "42tokyo.jp",
        "default_hidden_phone": true
      },
      {
        "id": 22,
        "name": "Madrid",
        "time_zone": "Europe/Madrid",
        "language": {
          "id": 11,
          "name": "Spanish",
          "identifier": "es",
          "created_at": "2019-08-09T15:14:32.544Z",
          "updated_at": "2023-06-01T08:48:08.035Z"
        },
        "users_count": 5941,
        "vogsphere_id": 15,
        "country": "Spain",
        "address": "Distrito Telefónica - Edificio Norte 3, Ronda de la Comunicación, s/n",
        "zip": "28050",
        "city": "Madrid",
        "website": "http://www.42madrid.com/",
        "facebook": "https://facebook.com/fundaciontef",
        "twitter": "https://twitter.com/42MadridFTef",
        "active": true,
        "public": true,
        "email_extension": "42madrid.com",
        "default_hidden_phone": true
      },
      {
        "id": 14,
        "name": "Amsterdam",
        "time_zone": "Europe/Amsterdam",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-06-01T11:31:18.366Z"
        },
        "users_count": 1957,
        "vogsphere_id": 8,
        "country": "Netherlands",
        "address": "Kattenburgerstraat 7",
        "zip": "1018 JA",
        "city": "Amsterdam",
        "website": "http://www.codam.nl",
        "facebook": "https://www.facebook.com/codamcodingcollege/",
        "twitter": "https://twitter.com/CodamCollege",
        "active": true,
        "public": true,
        "email_extension": "codam.nl",
        "default_hidden_phone": false
      },
      {
        "id": 16,
        "name": "Khouribga",
        "time_zone": "Africa/Casablanca",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-26T08:53:54.572Z"
        },
        "users_count": 2880,
        "vogsphere_id": 6,
        "country": "Morocco",
        "address": "Mail Central",
        "zip": "25000",
        "city": "Khouribga",
        "website": "https://1337.ma",
        "facebook": "",
        "twitter": "https://twitter.com/1337FIL",
        "active": true,
        "public": true,
        "email_extension": "1337.ma",
        "default_hidden_phone": false
      },
      {
        "id": 21,
        "name": "Benguerir",
        "time_zone": "Africa/Casablanca",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-05-26T08:53:54.572Z"
        },
        "users_count": 2022,
        "vogsphere_id": 11,
        "country": "Morocco",
        "address": "Lot 660, Hay Moulay Rachid, Ben Guerir 43150",
        "zip": "43150",
        "city": "Benguerir",
        "website": "https://1337.ma",
        "facebook": "https://www.facebook.com/1337FutureIsLoading",
        "twitter": "https://twitter.com/1337FIL",
        "active": true,
        "public": true,
        "email_extension": "1337.ma",
        "default_hidden_phone": false
      },
      {
        "id": 12,
        "name": "19",
        "time_zone": "Europe/Brussels",
        "language": {
          "id": 2,
          "name": "English",
          "identifier": "en",
          "created_at": "2015-04-14T16:07:38.122Z",
          "updated_at": "2023-05-25T08:47:43.953Z"
        },
        "users_count": 2049,
        "vogsphere_id": 5,
        "country": "Belgium",
        "address": "Cantersteen 10/12",
        "zip": "1000",
        "city": "Brussels",
        "website": "https://www.campus19.be",
        "facebook": "https://www.facebook.com/19network42/",
        "twitter": "https://twitter.com/19network42/",
        "active": true,
        "public": true,
        "email_extension": "s19.be",
        "default_hidden_phone": false
      },
      {
        "id": 1,
        "name": "Paris",
        "time_zone": "Europe/Paris",
        "language": {
          "id": 1,
          "name": "Français",
          "identifier": "fr",
          "created_at": "2014-11-02T16:43:38.466Z",
          "updated_at": "2023-06-01T08:48:03.513Z"
        },
        "users_count": 25946,
        "vogsphere_id": 1,
        "country": "France",
        "address": "96, boulevard Bessières",
        "zip": "75017",
        "city": "Paris",
        "website": "http://www.42.fr/",
        "facebook": "https://facebook.com/42born2code",
        "twitter": "https://twitter.com/42born2code",
        "active": true,
        "public": true,
        "email_extension": "42.fr",
        "default_hidden_phone": false
      }
    ],
    "videos": [],
    "project_sessions": [
      {
        "id": 8482,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 13,
        "cursus_id": 21,
        "created_at": "2022-09-30T15:13:03.302Z",
        "updated_at": "2023-05-02T08:47:42.774Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23279,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 17941,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 17300,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 9937,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 47,
        "cursus_id": 21,
        "created_at": "2023-04-13T12:05:36.959Z",
        "updated_at": "2023-04-13T13:00:14.804Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 22907,
            "correction_number": 3,
            "is_primary": true
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "8fd4c7ce4840f216f43004463926e3e3fe19725b"
      },
      {
        "id": 9737,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 12,
        "cursus_id": 21,
        "created_at": "2023-03-30T13:21:58.105Z",
        "updated_at": "2023-06-02T10:19:25.795Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23972,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 23971,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 22496,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 4850,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 14,
        "cursus_id": 21,
        "created_at": "2020-09-03T16:42:03.432Z",
        "updated_at": "2023-05-02T10:57:03.362Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23285,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 23011,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 16423,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 9825,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 3502,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 3235,
            "correction_number": 5,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 9249,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 26,
        "cursus_id": 21,
        "created_at": "2023-01-25T03:04:33.953Z",
        "updated_at": "2023-05-08T09:20:59.876Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23357,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 20080,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 7138,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 1,
        "cursus_id": 21,
        "created_at": "2022-02-03T14:18:48.624Z",
        "updated_at": "2023-05-22T09:18:39.200Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23686,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 14892,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 16892,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 11295,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 6629,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 1,
        "cursus_id": 53,
        "created_at": "2021-10-20T13:34:55.539Z",
        "updated_at": "2023-05-22T09:18:46.786Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 23687,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 14890,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 16893,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 8988,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 9031,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 39,
        "cursus_id": 21,
        "created_at": "2022-11-17T14:07:45.665Z",
        "updated_at": "2022-11-17T14:07:49.218Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 18982,
            "correction_number": 3,
            "is_primary": true
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "8fd4c7ce4840f216f43004463926e3e3fe19725b"
      },
      {
        "id": 8825,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 9,
        "cursus_id": 21,
        "created_at": "2022-11-14T16:38:33.364Z",
        "updated_at": "2022-11-15T12:55:46.769Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 18721,
            "correction_number": 3,
            "is_primary": true
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "8fd4c7ce4840f216f43004463926e3e3fe19725b"
      },
      {
        "id": 8118,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 25,
        "cursus_id": 21,
        "created_at": "2022-07-18T14:58:21.486Z",
        "updated_at": "2023-01-31T15:33:00.144Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 20321,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 15437,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "8fd4c7ce4840f216f43004463926e3e3fe19725b"
      },
      {
        "id": 7600,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": 41,
        "cursus_id": 21,
        "created_at": "2022-03-19T16:51:21.264Z",
        "updated_at": "2023-05-08T08:40:22.967Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 17129,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 23353,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 14408,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 13180,
            "correction_number": 3,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      },
      {
        "id": 3502,
        "solo": true,
        "begin_at": null,
        "end_at": null,
        "estimate_time": "98 hours",
        "difficulty": 9450,
        "objectives": [
          "DataScience",
          "EEG",
          "Classification"
        ],
        "description": "Learn to use python tools to process large dimension data, and create a man-machine interface thanks to brainwaves.",
        "duration_days": null,
        "terminating_after": null,
        "project_id": 1460,
        "campus_id": null,
        "cursus_id": null,
        "created_at": "2019-09-23T12:07:06.947Z",
        "updated_at": "2023-04-27T14:36:22.239Z",
        "max_people": null,
        "is_subscriptable": true,
        "scales": [
          {
            "id": 16659,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 23264,
            "correction_number": 3,
            "is_primary": true
          },
          {
            "id": 14891,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 8267,
            "correction_number": 3,
            "is_primary": false
          },
          {
            "id": 3458,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 2279,
            "correction_number": 5,
            "is_primary": false
          },
          {
            "id": 1547,
            "correction_number": 5,
            "is_primary": false
          }
        ],
        "uploads": [],
        "team_behaviour": "user",
        "commit": "31cd76d8f30b43a4f446bba6604202578f1da008"
      }
    ]
  }
]
CursusSkills details

Given the following Cursus:

{
  "id":21,
  "created_at":"2019-07-29T08:45:17.896Z",
  "name":"42cursus",
  "slug":"42cursus",
  "kind":"main"
}

We can find out the skills for the cursus by using it's id (#21)

curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/cursus/21/skills

In the example we check the range: [2023-06-02,2023-06-03] to avoid unnecessary RAM memory usage, but this request&response should not be too long. The real implementation should use the cursus updated_at and the current time.

curl -H "Authorization: Bearer Your_Access_Token" "https://api.intra.42.fr/v2/cursus/21/skills?&range%5Bupdated_at%5D=2023-06-02,2023-06-03&&per_page=10&page=1"

[square brackets need to be URL encoded as mentioned on RFC 3986]

[
  {
    "id": 14,
    "slug": "adaptation-creativity",
    "name": "Adaptation & creativity",
    "created_at": "2014-12-04T14:38:04.450Z"
  }
]

At the end we need to update all the "updated_at" when on success.

We can also use the range for the Cursus, Skills & Projects, but for that we would need another field on our data base, one for each update.

We should consider a table like "Intra Elements Settings"

It could contain the updated_at of the elements.

It could also contain the amount of elements it updates at each call "per_page".

Also we could add the rate for the cron job, this is how "often" it gets updated, daily, weekly, hourly; etc.

And we could also have another table OneToMany for updates. This would be a table which will keep track of all our update attempts and will let us know it that update was successful or if it failed.

Updating users

// TODO