11 |
12 |
--------------------------------------------------------------------------------
/routes/api.php:
--------------------------------------------------------------------------------
1 | get('/user', 'Api/UserController@show');
15 |
--------------------------------------------------------------------------------
/app/Providers/AppServiceProvider.php:
--------------------------------------------------------------------------------
1 | id === (int) $id;
16 | });
17 |
--------------------------------------------------------------------------------
/app/Http/Middleware/Authenticate.php:
--------------------------------------------------------------------------------
1 | expectsJson()) {
18 | return route('login');
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/Http/Middleware/VerifyCsrfToken.php:
--------------------------------------------------------------------------------
1 | '« Précédent',
15 | 'next' => 'Suivant »',
16 | ];
--------------------------------------------------------------------------------
/webpack.mix.js:
--------------------------------------------------------------------------------
1 | const mix = require('laravel-mix');
2 |
3 | /*
4 | |--------------------------------------------------------------------------
5 | | Mix Asset Management
6 | |--------------------------------------------------------------------------
7 | |
8 | | Mix provides a clean, fluent API for defining some Webpack build steps
9 | | for your Laravel application. By default, we are compiling the Sass
10 | | file for the application as well as bundling up all the JS files.
11 | |
12 | */
13 |
14 | mix
15 | .js('resources/js/app.js', 'public/js')
16 | .sass('resources/sass/app.scss', 'public/css')
17 | .version();
18 |
--------------------------------------------------------------------------------
/resources/lang/en/pagination.php:
--------------------------------------------------------------------------------
1 | '« Previous',
17 | 'next' => 'Next »',
18 |
19 | ];
20 |
--------------------------------------------------------------------------------
/routes/console.php:
--------------------------------------------------------------------------------
1 | comment(Inspiring::quote());
18 | })->describe('Display an inspiring quote');
19 |
--------------------------------------------------------------------------------
/app/Policies/TextPolicy.php:
--------------------------------------------------------------------------------
1 | scores['questions'][$question->id] ?? 0 >= self::MIN_SCORE_PER_QUESTION;
19 | }
20 |
21 | public function update(User $user, Text $text)
22 | {
23 | return $text->user_id == $user->id;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/server.php:
--------------------------------------------------------------------------------
1 |
8 | */
9 |
10 | $uri = urldecode(
11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
12 | );
13 |
14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the
15 | // built-in PHP web server. This provides a convenient way to test a Laravel
16 | // application without having installed a "real" web server software here.
17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
18 | return false;
19 | }
20 |
21 | require_once __DIR__.'/public/index.php';
22 |
--------------------------------------------------------------------------------
/app/Http/Controllers/ProposalController.php:
--------------------------------------------------------------------------------
1 | responses()->join('questions', 'questions.id', 'responses.question_id')->orderBy('questions.order')->get();
14 | $debate = Debate::find(floor($proposal->id / 1000000));
15 | $next_proposal = Proposal::inRandomOrder()->first();
16 | return view('proposals.show', compact('debate', 'proposal', 'responses', 'next_proposal'));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/resources/views/texts/legal-warning.blade.php:
--------------------------------------------------------------------------------
1 |
2 | En soumettant votre texte de synthèse, vous reconnaissez que celui-ci sera diffusé sur ce site,
3 | et associé au pseudonyme que vous avez utilisé pour votre inscription.
4 | Vous pouvez modifier votre pseudonyme à tout moment depuis l'onglet Mon compte.
5 | Votre texte sera aussi rendu disponible au téléchargement sous la licence
6 | Creative Commons Attribution Share
7 | Alike 4.0 International (CC-BY-SA-4.0)
8 | avec le reste des données produites sur ce site.
9 |
10 | Un lien de vérification a été envoyé à votre adresse électronique.
11 |
12 | @endif
13 |
14 | Avant de continuer, veuillez chercher le lien de vérification dans votre courrier électronique.
15 | Si vous n'avez pas reçu le lien, cliquez ici pour en recevoir
16 | un autre.
17 |
18 |
19 | @endsection
20 |
--------------------------------------------------------------------------------
/app/Repositories/TagRepository.php:
--------------------------------------------------------------------------------
1 | getTagsForQuestionUser($question, $user)->map(function ($tag) { return $tag->toArray(); });
13 | }
14 |
15 | public function getTagsForQuestionUser(Question $question, User $user = null)
16 | {
17 | return $question->tags()->where(function ($query) use ($user) {
18 | if ($user == null) {
19 | return $query->whereNull('user_id');
20 | } else {
21 | return $query->whereNull('user_id')->orWhere('user_id', $user->id);
22 | }
23 | })->orderBy('name')->get();
24 | }
25 | }
--------------------------------------------------------------------------------
/database/migrations/2019_03_17_110237_add_cities.php:
--------------------------------------------------------------------------------
1 | string('city')->default('France');
19 | });
20 | }
21 |
22 | /**
23 | * Reverse the migrations.
24 | *
25 | * @return void
26 | */
27 | public function down()
28 | {
29 | Schema::table('proposals', function (Blueprint $table) {
30 | $table->dropColumn('city');
31 | });
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/database/migrations/2019_02_28_182539_alter_tags_add_color.php:
--------------------------------------------------------------------------------
1 | string('color')->default('blue');
18 | });
19 | }
20 |
21 | /**
22 | * Reverse the migrations.
23 | *
24 | * @return void
25 | */
26 | public function down()
27 | {
28 | Schema::table('tags', function (Blueprint $table) {
29 | $table->dropColumn('color');
30 | });
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Notifications/ResetPassword.php:
--------------------------------------------------------------------------------
1 | subject('Ré-initialisation de mot de passe pour ' . config('app.name'))
15 | ->line('Vous recevez ce message car nous avons reçu une demande de ré-initialisation de mot de passe pour votre compte.')
16 | ->action('Choisir un nouveau mot de passe', url('password/reset', $this->token))
17 | ->line("Si vous n'avez pas demandé à ré-initialiser votre mot de passe, aucune action n'est nécessaire de votre part.");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/database/migrations/2019_02_08_131014_nullable_email.php:
--------------------------------------------------------------------------------
1 | string('email')->nullable()->change();
18 | });
19 | }
20 |
21 | /**
22 | * Reverse the migrations.
23 | *
24 | * @return void
25 | */
26 | public function down()
27 | {
28 | Schema::table('users', function (Blueprint $table) {
29 | $table->string('email')->nullable(false)->change();
30 | });
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/resources/views/tags/show.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layouts.app')
2 |
3 | @section('content')
4 |
5 |
6 | Exemples de réponses annotées avec la catégorie {{ $tag->getLabel() }}
7 |
9 | Vous allez supprimer votre compte. Votre nom d'affichage et votre adresse électronique seront alors
10 | immédiatement effacés de la base de données. Il ne sera plus possible de récupérer votre compte.
11 | Vos annotations apparaîtront alors sous le pseudonyme Utilisateur supprimé.
12 |
15 |
16 |
17 |
32 |
33 |
--------------------------------------------------------------------------------
/app/Logic/Stats.php:
--------------------------------------------------------------------------------
1 | select('tag_id')
15 | ->groupBy('clean_value_group_id', 'tag_id')
16 | ->where('user_id', $user->id)
17 | ->where('question_id', $question->id)
18 | ->get();
19 | $tagCounts = [];
20 | foreach ($userActions as $userAction) {
21 | $tagCounts[$userAction->tag_id] = ($tagCounts[$userAction->tag_id] ?? 0) + 1;
22 | }
23 | $tags = Tag::whereIn('id', array_keys($tagCounts))->get()->keyBy('id');
24 | $stats = [];
25 | foreach ($tagCounts as $tagId => $tagCount) {
26 | $stats[$tags[$tagId]->getLabel()] = $tagCount;
27 | }
28 | arsort($stats);
29 | if (count($stats) > 15) {
30 | $stats = array_slice($stats, 0, 15);
31 | }
32 | return $stats;
33 | }
34 | }
--------------------------------------------------------------------------------
/public/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
22 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/LoginController.php:
--------------------------------------------------------------------------------
1 | middleware('guest')->except('logout');
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/config/view.php:
--------------------------------------------------------------------------------
1 | [
17 | resource_path('views'),
18 | ],
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Compiled View Path
23 | |--------------------------------------------------------------------------
24 | |
25 | | This option determines where all the compiled Blade templates will be
26 | | stored for your application. Typically, this is within the storage
27 | | directory. However, as usual, you are free to change this value.
28 | |
29 | */
30 |
31 | 'compiled' => env(
32 | 'VIEW_COMPILED_PATH',
33 | realpath(storage_path('framework/views'))
34 | ),
35 |
36 | ];
37 |
--------------------------------------------------------------------------------
/app/Http/Controllers/DebateController.php:
--------------------------------------------------------------------------------
1 | questionRepository = $questionRepository;
19 | }
20 |
21 | public function show(Request $request, Debate $debate)
22 | {
23 | $user = $request->user();
24 | $progress = [];
25 | foreach ($debate->questions as $question) {
26 | # Show progress with respect to target goal of 10% reading
27 | $progress[$question->id] = min(100, ceil(1000 - $question->priority));
28 | }
29 | return view('debates.show', compact('debate', 'user', 'progress'));
30 | }
31 |
32 | public function random(Request $request, Debate $debate)
33 | {
34 | $question = $this->questionRepository->randomQuestion($request->user(), $debate);
35 | return redirect('/questions/' . $question->id . '/read');
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 | ./tests/Unit
14 |
15 |
16 |
17 | ./tests/Feature
18 |
19 |
20 |
21 |
22 | ./app
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/resources/js/app.js:
--------------------------------------------------------------------------------
1 | /**
2 | * First we will load all of this project's JavaScript dependencies which
3 | * includes Vue and other libraries. It is a great starting point when
4 | * building robust, powerful web applications using Vue and Laravel.
5 | */
6 |
7 | require('./bootstrap');
8 |
9 | // This import adds "Promise" support in IE11 which lacks it otherwise
10 | require('es6-promise').polyfill();
11 |
12 | window.Vue = require('vue');
13 |
14 | var Chart = require('chart.js');
15 | export { Chart };
16 |
17 | /**
18 | * The following block of code may be used to automatically register your
19 | * Vue components. It will recursively scan this directory for the Vue
20 | * components and automatically register them with their "basename".
21 | *
22 | * Eg. ./components/ExampleComponent.vue ->
23 | */
24 |
25 | const files = require.context('./', true, /\.vue$/i);
26 | files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default));
27 |
28 | /**
29 | * Next, we will create a fresh Vue application instance and attach it to
30 | * the page. Then, you may begin adding components to this application
31 | * or customize the JavaScript scaffolding to fit your unique needs.
32 | */
33 |
34 | const app = new Vue({
35 | el: '#app',
36 | });
37 |
--------------------------------------------------------------------------------
/app/Models/Tag.php:
--------------------------------------------------------------------------------
1 | belongsTo(Question::class);
19 | }
20 |
21 | public function actions()
22 | {
23 | return $this->hasMany(Action::class);
24 | }
25 |
26 | public function user()
27 | {
28 | return $this->belongsTo(User::class);
29 | }
30 |
31 | public function toArray()
32 | {
33 | return [
34 | 'id' => $this->id,
35 | 'checked' => false,
36 | 'color' => $this->color,
37 | 'label' => $this->getLabel(),
38 | 'name' => $this->name,
39 | 'is_custom' => $this->isCustom(),
40 | ];
41 | }
42 |
43 | public function getLabel()
44 | {
45 | // Remove the first letter which is used to sort tags
46 | return preg_replace('/^[A-Z] /', '', $this->name);
47 | }
48 |
49 | public function isCustom()
50 | {
51 | return $this->user_id !== null;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/VerificationController.php:
--------------------------------------------------------------------------------
1 | middleware('auth');
39 | $this->middleware('signed')->only('verify');
40 | $this->middleware('throttle:6,1')->only('verify', 'resend');
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/database/migrations/2019_02_07_202755_create_audits_table.php:
--------------------------------------------------------------------------------
1 | increments('id');
18 | $table->string('user_type')->nullable();
19 | $table->unsignedBigInteger('user_id')->nullable();
20 | $table->string('event');
21 | $table->morphs('auditable');
22 | $table->text('old_values')->nullable();
23 | $table->text('new_values')->nullable();
24 | $table->text('url')->nullable();
25 | $table->ipAddress('ip_address')->nullable();
26 | $table->string('user_agent')->nullable();
27 | $table->string('tags')->nullable();
28 | $table->timestamps();
29 |
30 | $table->index(['user_id', 'user_type']);
31 | });
32 | }
33 |
34 | /**
35 | * Reverse the migrations.
36 | *
37 | * @return void
38 | */
39 | public function down()
40 | {
41 | Schema::drop('audits');
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/database/migrations/2019_02_21_152646_alter_qdr_add_priority.php:
--------------------------------------------------------------------------------
1 | integer('priority')->default(0);
18 | });
19 | Schema::table('questions', function (Blueprint $table) {
20 | $table->integer('priority')->default(0);
21 | });
22 | Schema::table('responses', function (Blueprint $table) {
23 | $table->integer('priority')->default(1);
24 | });
25 | }
26 |
27 | /**
28 | * Reverse the migrations.
29 | *
30 | * @return void
31 | */
32 | public function down()
33 | {
34 | Schema::table('debates', function (Blueprint $table) {
35 | $table->dropColumn('priority');
36 | });
37 | Schema::table('questions', function (Blueprint $table) {
38 | $table->dropColumn('priority');
39 | });
40 | Schema::table('responses', function (Blueprint $table) {
41 | $table->dropColumn('priority');
42 | });
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/config/services.php:
--------------------------------------------------------------------------------
1 | [
18 | 'domain' => env('MAILGUN_DOMAIN'),
19 | 'secret' => env('MAILGUN_SECRET'),
20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
21 | ],
22 |
23 | 'ses' => [
24 | 'key' => env('SES_KEY'),
25 | 'secret' => env('SES_SECRET'),
26 | 'region' => env('SES_REGION', 'us-east-1'),
27 | ],
28 |
29 | 'sparkpost' => [
30 | 'secret' => env('SPARKPOST_SECRET'),
31 | ],
32 |
33 | 'stripe' => [
34 | 'model' => App\User::class,
35 | 'key' => env('STRIPE_KEY'),
36 | 'secret' => env('STRIPE_SECRET'),
37 | 'webhook' => [
38 | 'secret' => env('STRIPE_WEBHOOK_SECRET'),
39 | 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
40 | ],
41 | ],
42 |
43 | ];
44 |
--------------------------------------------------------------------------------
/app/Exceptions/Handler.php:
--------------------------------------------------------------------------------
1 |
5 |
6 | Injection dans la catégorie {{ $tag->name }} pour la question {{ $question->text }}
7 |
8 |
9 |
10 | Attention !
11 | Vous allez injecter les catégories créées par des utilisateurs dans une catégorie commune.
12 | Les utilisateurs concernés seront avertis par message de l'opération.
13 |
6 | Renommage d'une catégorie pour la question {{ $question->text }}
7 |
8 |
9 | @if ($tag->actions()->exists())
10 |
11 | Attention ! Vous allez renommer une catégorie déjà affectée à des contributions.
12 | Faites en sorte que le nouveau nom garde globalement le même sens pour ne pas biaiser
13 | vos analyses précédentes. Les contributions attachées à l'ancien nom de la catégorie
14 | seront désormais attachées au nouveau nom de la catégorie.
15 |
20 | Votre pseudonyme est notamment affiché en marge des textes libres de synthèse que vous pouvez
21 | rédiger une fois que vous avez lu {{ \App\Policies\TextPolicy::MIN_SCORE_PER_QUESTION }} réponses
22 | à une même question. Vous êtes libres d'y renseigner votre vrai nom ou non.
23 |
8 | Cet écran vous permet de modifier un texte libre de synthèse que vous avez déjà écrit.
9 | Pour mettre en forme légèrement votre texte (gras, italique, listes, titres,
10 | liens, etc.) vous pouvez utiliser la syntaxe Markdown.
11 |
8 | Cette page recense les textes libres écrits par la communauté des annotateurs pour traduire leur
9 | ressenti après la lecture de centaines de réponses à certaines questions. Il ne s'agit pas
10 | des analyses officielles, mais bien d'analyses individuelles, produites par des personnes
11 | ayant utilisé ce site pour comprendre ce qui les contributeurs de
12 | granddebat.fr avaient écrit.
13 | Si vous aussi vous avez beaucoup lu, nous vous invitons à écrire un texte.
14 |
26 | Vous comprenez un texte bien mieux que n'importe quelle IA !
27 | Venez donc lire vous-même les contributions de vos concitoyens au grand débat.
28 | Promis, vous en apprendrez bien plus qu'en lisant des synthèses artificielles
29 | (qui ne sont que des décomptes des thématiques les plus fréquentes).
30 | Il y a plein d'idées et d'émotions à découvrir.
31 | Ensemble, nous construisons une synthèse collective, transparente et fondée sur
32 | l'intelligence humaine.
33 |
39 |
40 |
41 | @endsection
42 |
--------------------------------------------------------------------------------
/public/resources/README.txt:
--------------------------------------------------------------------------------
1 | Attention !
2 | Document à lire avant toute utilisation des données ci-jointes
3 |
4 | Par souci de transparence, nous tenons à publier ici les données brutes de
5 | toutes les annotations saisies dans la plateforme. Néanmoins, nous insistons
6 | sur le fait qu'il s'agit de données non retraitées qu'il convient de prendre
7 | avec prudence. En particulier, elles contiennent :
8 |
9 | 1) des tentatives de manipulation frauduleuse de la plateforme (du type,
10 | "je clique toujours sur le même bouton" ou "je clique aléatoirement"),
11 |
12 | 2) des erreurs de saisies, même par les annoteurs vertueux (clic qui dérape,
13 | clic trop rapide),
14 |
15 | 3) toutes les annotations, y compris celles qui n'ont pas (ou pas encore) été
16 | corroborées par trois lectures concordantes.
17 |
18 | Par ailleurs, lorsqu'une personne réalise une annotation sur un texte fréquent
19 | (typiquement, un texte court comme "Santé et éducation"), toutes les réponses
20 | contenant le texte à l'identique sont automatiquement catégorisées aussi,
21 | pour faire gagner du temps à tous.
22 |
23 | Pour toutes ces raisons, il ne faut surtout pas faire d'analyse quantitative du
24 | fichier brut avant d'avoir procédé à un profond nettoyage de données (détection
25 | de fraude, recherche des lectures concordantes, redressement des réponses
26 | fréquentes). Un simple décompte des libellés les plus fréquents dans le fichier
27 | ci-joint aboutira mécaniquement à des biais statistiques majeurs, comme la
28 | sur-représentation des annotations posées sur des textes courts.
29 |
30 | Nous rendrons progressivement disponibles des propositions de scripts de
31 | retraitement.
32 |
33 | Vous pouvez nous contacter (voir la FAQ sur le site https://grandeannotation.fr).
34 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/UserController.php:
--------------------------------------------------------------------------------
1 | user();
16 | return view('users.show', compact('user'));
17 | }
18 |
19 | public function edit(Request $request)
20 | {
21 | $user = $request->user();
22 | return view('users.edit', compact('user'));
23 | }
24 |
25 | public function update(Request $request)
26 | {
27 | $user = $request->user();
28 | $new_name = $request->input('name');
29 | if (User::where('name', 'ILIKE', $new_name)->where('id', '!=', $user->id)->exists()) {
30 | return redirect('/account/edit')
31 | ->withInput()
32 | ->withErrors(["name" => "Ce pseudonyme est déjà utilisé. Merci d'en choisir un autre."]);
33 | }
34 | $user->name = $new_name;
35 | $user->save();
36 | return view('users.show', compact('user'));
37 | }
38 |
39 | public function showQuit()
40 | {
41 | return view('auth.delete');
42 | }
43 |
44 | public function doQuit(Request $request)
45 | {
46 | $user = $request->user();
47 | $user->name = "Utilisateur supprimé";
48 | $user->email = null;
49 | $user->password = Hash::make("nopassword");
50 | $user->save();
51 | Auth::logoutOtherDevices("nopassword");
52 | Auth::logout();
53 | $request->session()->invalidate();
54 | return redirect('/');
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/config/hashing.php:
--------------------------------------------------------------------------------
1 | 'bcrypt',
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Bcrypt Options
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here you may specify the configuration options that should be used when
26 | | passwords are hashed using the Bcrypt algorithm. This will allow you
27 | | to control the amount of time it takes to hash the given password.
28 | |
29 | */
30 |
31 | 'bcrypt' => [
32 | 'rounds' => env('BCRYPT_ROUNDS', 10),
33 | ],
34 |
35 | /*
36 | |--------------------------------------------------------------------------
37 | | Argon Options
38 | |--------------------------------------------------------------------------
39 | |
40 | | Here you may specify the configuration options that should be used when
41 | | passwords are hashed using the Argon algorithm. These will allow you
42 | | to control the amount of time it takes to hash the given password.
43 | |
44 | */
45 |
46 | 'argon' => [
47 | 'memory' => 1024,
48 | 'threads' => 2,
49 | 'time' => 2,
50 | ],
51 |
52 | ];
53 |
--------------------------------------------------------------------------------
/app/Repositories/ResponseRepository.php:
--------------------------------------------------------------------------------
1 | random($question);
13 | } else {
14 | if ($question->status != 'open') {
15 | // While admins prepare default tags, it is important to navigate randomly without the priority ranking
16 | // Non admin users also should be able to navigate through the whole set (and not just top priority)
17 | $response = $this->untagged($question, $user)->inRandomOrder()->first();
18 | } else {
19 | // Don't show the user a response he skipped before (to avoid recurring loops)
20 | $response = $this->untagged($question, $user)
21 | ->whereDoesntHave('skips', function ($query) use ($user) {
22 | $query->where('user_id', $user->id);
23 | })
24 | ->orderByRaw('priority DESC, RANDOM()')
25 | ->first();
26 | }
27 | if ($response == null) {
28 | return $this->random($question);
29 | } else {
30 | return $response;
31 | }
32 | }
33 | }
34 |
35 | public function random(Question $question)
36 | {
37 | return $question->responses()->inRandomOrder()->first();
38 | }
39 |
40 | private function untagged(Question $question, $user)
41 | {
42 | return $question->responses()->whereDoesntHave('actions', function ($query) use ($user) {
43 | return $query->where('user_id', '=', $user->id);
44 | });
45 | }
46 | }
--------------------------------------------------------------------------------
/resources/views/auth/passwords/email.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layouts.app')
2 |
3 | @section('content')
4 |
5 |
Réinitialisation du mot de passe
6 |
7 |
8 | @if (session('status'))
9 |
10 | {{ session('status') }}
11 |
12 | @endif
13 |
14 |
41 |
42 |
43 | @endsection
44 |
--------------------------------------------------------------------------------
/public/svg/banner.svg:
--------------------------------------------------------------------------------
1 |
14 |
--------------------------------------------------------------------------------
/bootstrap/app.php:
--------------------------------------------------------------------------------
1 | singleton(
30 | Illuminate\Contracts\Http\Kernel::class,
31 | App\Http\Kernel::class
32 | );
33 |
34 | $app->singleton(
35 | Illuminate\Contracts\Console\Kernel::class,
36 | App\Console\Kernel::class
37 | );
38 |
39 | $app->singleton(
40 | Illuminate\Contracts\Debug\ExceptionHandler::class,
41 | App\Exceptions\Handler::class
42 | );
43 |
44 | /*
45 | |--------------------------------------------------------------------------
46 | | Return The Application
47 | |--------------------------------------------------------------------------
48 | |
49 | | This script returns the application instance. The instance is given to
50 | | the calling script so we can separate the building of the instances
51 | | from the actual running of the application and sending responses.
52 | |
53 | */
54 |
55 | return $app;
56 |
--------------------------------------------------------------------------------
/resources/js/components/ToggleButton.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ tag.label }}
5 |
6 |
7 |
8 |
26 |
27 |
--------------------------------------------------------------------------------
/resources/js/components/Samples.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Contresens
6 |
7 |
8 | Confusion
9 |
10 |
11 | Incompréhension
12 |
13 |
14 |
15 |
16 |
17 |
18 |
41 |
42 |
58 |
--------------------------------------------------------------------------------
/config/broadcasting.php:
--------------------------------------------------------------------------------
1 | env('BROADCAST_DRIVER', 'null'),
19 |
20 | /*
21 | |--------------------------------------------------------------------------
22 | | Broadcast Connections
23 | |--------------------------------------------------------------------------
24 | |
25 | | Here you may define all of the broadcast connections that will be used
26 | | to broadcast events to other systems or over websockets. Samples of
27 | | each available type of connection are provided inside this array.
28 | |
29 | */
30 |
31 | 'connections' => [
32 |
33 | 'pusher' => [
34 | 'driver' => 'pusher',
35 | 'key' => env('PUSHER_APP_KEY'),
36 | 'secret' => env('PUSHER_APP_SECRET'),
37 | 'app_id' => env('PUSHER_APP_ID'),
38 | 'options' => [
39 | 'cluster' => env('PUSHER_APP_CLUSTER'),
40 | 'useTLS' => true,
41 | ],
42 | ],
43 |
44 | 'redis' => [
45 | 'driver' => 'redis',
46 | 'connection' => 'default',
47 | ],
48 |
49 | 'log' => [
50 | 'driver' => 'log',
51 | ],
52 |
53 | 'null' => [
54 | 'driver' => 'null',
55 | ],
56 |
57 | ],
58 |
59 | ];
60 |
--------------------------------------------------------------------------------
/resources/views/book.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layouts.visitor')
2 |
3 | @section('jumbo')
4 |
5 | Les contributions libres au grand débat
6 |
7 |
8 |
9 | Plus de 5 millions de textes ont été rédigés en réponse aux questions ouvertes.
10 |
11 |
12 | Ensemble, sur grandeannotation.fr, nous en avons déjà annoté {{ number_format($done_count, 0, ',', ' ') }}.
13 |
14 |
15 | Chacun a été lu et interprété plusieurs fois. À votre tour, lisez-en ci-dessous.
16 |
27 | Vous comprenez un texte bien mieux que n'importe quelle IA !
28 | Vous souhaitez contribuer et nous aider à construire
29 | une synthèse collective, transparente et fondée sur l'intelligence humaine ?
30 | Il vous suffit de continuer à lire les textes en cochant les idées clefs associées.
31 | En 10 minutes par jour, vous faciliterez les analyses futures de chercheurs, journalistes
32 | ou d'autres citoyens !
33 |
9 | Les badges pour permettent de visualiser votre progression d'une manière ludique. Ils vous sont attribués
10 | au fur et à mesure que vous annotez des réponses.
11 | @auth
12 | Actuellement, vous êtes {{ $level[2] }}
13 | car vous avez annoté {{ $user->scores['total'] . ($user->scores['total'] > 1 ? ' textes' : ' texte') }}.
14 | Pour continuer à progresser, c'est par ici.
15 | @else
16 | Créez un compte ou connectez-vous pour commencer à gravir
17 | les échelons.
18 | @endauth
19 |
6 | Suppression d'une catégorie pour la question {{ $question->text }}
7 |
8 |
9 | @if ($tag->actions()->exists())
10 |
11 | Attention ! Vous allez supprimer une catégorie que vous avez déjà affectée à des
12 | contributions. Cette catégorie sera retirée des annotations que vous avez réalisées en l'utilisant.
13 | Il se peut que votre score baisse un peu suite à cette manipulation ; mais ça n'est pas très grave !
14 | En supprimant d'anciennes catégories que vous ne souhaitez plus utiliser, vous simplifiez votre
15 | interface et cela vous permet d'aller plus vite dans le processus d'annotation.
16 |
17 | @else
18 |
19 | Vous allez supprimer une catégorie que vous n'avez pas encore utilisée. C'est absolument sans
20 | risque, vous pouvez y aller !
21 |
8 | Cet écran vous permet d'écrire un texte libre de synthèse sur une question pour laquelle vous avez lu
9 | beaucoup de réponses. Vous pourrez modifier ce texte par la suite en cliquant sur le petit stylo sur
10 | la page du texte. Vous ne pouvez créer qu'un seul texte par question, mais il vous est bien sûr possible
11 | de le modifier. Si vous avez beaucoup lu plusieurs questions, vous pouvez créer plusieurs textes
12 | (un texte par question). Pour mettre en forme légèrement votre texte (gras, italique, listes, titres,
13 | liens, etc.) vous pouvez utiliser la syntaxe Markdown.
14 |
33 | Pour l'instant, vous ne pouvez pas saisir de texte libre pour de nouvelles questions. Pour modifier
34 | vos textes libres déjà écrits, cliquez sur le petit stylo directement sur la page du texte. Pour
35 | obtenir le droit de saisir un texte de synthèse sur une nouvelle question, vous devez lire et
36 | annoter au moins {{ \App\Policies\TextPolicy::MIN_SCORE_PER_QUESTION }} réponses à
37 | cette question. Vous pouvez suivre votre progression dans la page de chaque thème. Écrire
38 | un résumé pertinent de ce qui s'est dit sur une thématique nécessite d'avoir lu beaucoup pour
39 | prendre du recul. Bon courage ! En moyenne, il faut quelques heures de lecture et d'annotation pour
40 | arriver à ce niveau.
41 |
42 | @endif
43 |
44 |
45 | @endsection
46 |
--------------------------------------------------------------------------------
/config/cache.php:
--------------------------------------------------------------------------------
1 | env('CACHE_DRIVER', 'file'),
21 |
22 | /*
23 | |--------------------------------------------------------------------------
24 | | Cache Stores
25 | |--------------------------------------------------------------------------
26 | |
27 | | Here you may define all of the cache "stores" for your application as
28 | | well as their drivers. You may even define multiple stores for the
29 | | same cache driver to group types of items stored in your caches.
30 | |
31 | */
32 |
33 | 'stores' => [
34 |
35 | 'apc' => [
36 | 'driver' => 'apc',
37 | ],
38 |
39 | 'array' => [
40 | 'driver' => 'array',
41 | ],
42 |
43 | 'database' => [
44 | 'driver' => 'database',
45 | 'table' => 'cache',
46 | 'connection' => null,
47 | ],
48 |
49 | 'file' => [
50 | 'driver' => 'file',
51 | 'path' => storage_path('framework/cache/data'),
52 | ],
53 |
54 | 'memcached' => [
55 | 'driver' => 'memcached',
56 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
57 | 'sasl' => [
58 | env('MEMCACHED_USERNAME'),
59 | env('MEMCACHED_PASSWORD'),
60 | ],
61 | 'options' => [
62 | // Memcached::OPT_CONNECT_TIMEOUT => 2000,
63 | ],
64 | 'servers' => [
65 | [
66 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
67 | 'port' => env('MEMCACHED_PORT', 11211),
68 | 'weight' => 100,
69 | ],
70 | ],
71 | ],
72 |
73 | 'redis' => [
74 | 'driver' => 'redis',
75 | 'connection' => 'cache',
76 | ],
77 |
78 | ],
79 |
80 | /*
81 | |--------------------------------------------------------------------------
82 | | Cache Key Prefix
83 | |--------------------------------------------------------------------------
84 | |
85 | | When utilizing a RAM based store such as APC or Memcached, there might
86 | | be other applications utilizing the same cache. So, we'll specify a
87 | | value to get prefixed to all our keys so we can avoid collisions.
88 | |
89 | */
90 |
91 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
92 |
93 | ];
94 |
--------------------------------------------------------------------------------
/resources/views/questions/show.blade.php:
--------------------------------------------------------------------------------
1 | @extends('layouts.app')
2 |
3 | @section('content')
4 |
5 |
6 | Catégorisation pour la question {{ $question->text }}
7 |
8 | La consultation du Grand débat national est articulée autour de quatre thèmes officiels.
9 | Chaque thème est sous-divisé en 10 à 30 questions. Certaines sont des questions fermées
10 | (à choix multiples) et donc très faciles à analyser. Nous nous concentrons donc ici sur les
11 | questions ouvertes (à texte libre) pour lesquelles la lecture est indispensable.
12 |
13 |
14 | Vous pouvez naviguer ici par thème puis par question, ou vous laisser porter au hasard.
15 | Certains thèmes ou questions ne sont pas encore ouverts à l'annotation car le travail
16 | de préparation des catégories par défaut est encore en cours. N'hésitez pas à revenir
17 | régulièrement.
18 |
8 | GrandeAnnotation.fr est un site non commercial non professionnel édité par une personne physique. Il a pour
9 | but de permettre l'annotation collective et manuelle, par des humains,
10 | des milliers de contributions au Grand Débat National initié
11 | sur le site officiel granddebat.fr.
12 | GrandeAnnotation.fr n'est ni le site officiel, ni un site gouvernemental.
13 |
14 |
Hébergement
15 |
16 | Ce site est hébergé par OVH, SAS au capital de 10 069 020 €, RCS Lille Métropole 424 761 419 00045, dont
17 | le siège social est sis 2 rue Kellermann, 59100 Roubaix, France.
18 |
19 |
Cookies
20 |
21 | Ce site n'utilise aucun cookie lié à de la mesure d'audience, de la publicité ou des réseaux sociaux.
22 | Les seuls cookies déposés dans votre navigateurs sont ceux indispensables au fonctionnement du site et
23 | liés à l'authentification et à la gestion de votre session.
24 |
25 |
Données personnelles
26 |
27 | Lors de votre inscription, vous saisissez un pseudonyme librement et une adresse électronique.
28 | Celle-ci n'est utilisée que pour vous permettre de ré-initialiser votre mot de passe en cas de perte.
29 | Vous ne recevrez aucun autre courriel de notre part.
30 |
31 |
32 | Vous pouvez à tout moment supprimer définitivement votre compte (depuis le menu "Mon compte" de la barre
33 | de navigation en haut à droite de l'écran, puis avec le lien "Supprimer mon compte"). Votre pseudonyme
34 | et votre adresse électronique sont alors immédiatement effacés de la base de données. Vos annotations
35 | seront alors liées au pseudonyme Utilisateur supprimé.
36 |
37 |
38 | Le code source de cette plateforme est ouvert et libre. Vous pourrez y constater notre bonne foi !
39 |
40 |
Origine des données
41 |
42 | Cette plateforme d'annotation repose sur les données du site
43 | https://granddebat.fr. Ces données ont été téléchargées dans leur
44 | version du 21 mars 2019, depuis la page
45 | https://granddebat.fr/pages/donnees-ouvertes.
46 | Ces données sont couvertes par la
47 | Licence Ouverte / Open License
48 | conçue par Etalab qui
49 | facilite et encourage la réutilisation des données publiques mises à disposition gratuitement.
50 |