Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagebash
themeConfluence
titleAttivazione moduli
drush en services
drush en rest_server
drush en services_views
drush en views_datasource
drush en services_basic_auth

Abbiamo creato due viste che espongono dei services,

...

Code Block
languagebash
themeConfluence
titleviews taxonomy terms configuration
linenumberstrue
collapsetrue
$view = new view();
$view->name = 'bandi_rest_terms';
$view->description = 'Termini di tassonomia usati nei bandi in rest per migrazione in Drupal 9';
$view->tag = 'default';
$view->base_table = 'taxonomy_term_data';
$view->human_name = 'bandi rest terms';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['exposed_form']['options']['reset_button_label'] = 'Ripristina';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['pager']['options']['tags']['first'] = '« prima';
$handler->display->display_options['pager']['options']['tags']['previous'] = '‹ precedente';
$handler->display->display_options['pager']['options']['tags']['next'] = 'seguente ›';
$handler->display->display_options['pager']['options']['tags']['last'] = 'ultima »';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Campo: Termine della tassonomia: ID Termine */
$handler->display->display_options['fields']['tid']['id'] = 'tid';
$handler->display->display_options['fields']['tid']['table'] = 'taxonomy_term_data';
$handler->display->display_options['fields']['tid']['field'] = 'tid';
$handler->display->display_options['fields']['tid']['label'] = 'term_id';
$handler->display->display_options['fields']['tid']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['tid']['separator'] = '';
/* Campo: Termine della tassonomia: Nome */
$handler->display->display_options['fields']['name']['id'] = 'name';
$handler->display->display_options['fields']['name']['table'] = 'taxonomy_term_data';
$handler->display->display_options['fields']['name']['field'] = 'name';
$handler->display->display_options['fields']['name']['label'] = 'name';
$handler->display->display_options['fields']['name']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['name']['alter']['ellipsis'] = FALSE;
$handler->display->display_options['fields']['name']['element_label_colon'] = FALSE;
/* Campo: Vocabolario della tassonomia: Nome ad uso interno */
$handler->display->display_options['fields']['machine_name']['id'] = 'machine_name';
$handler->display->display_options['fields']['machine_name']['table'] = 'taxonomy_vocabulary';
$handler->display->display_options['fields']['machine_name']['field'] = 'machine_name';
$handler->display->display_options['fields']['machine_name']['label'] = 'vocabulary';
$handler->display->display_options['fields']['machine_name']['element_label_colon'] = FALSE;
/* Filter criterion: Termine della tassonomia: Vocabolario */
$handler->display->display_options['filters']['vid']['id'] = 'vid';
$handler->display->display_options['filters']['vid']['table'] = 'taxonomy_term_data';
$handler->display->display_options['filters']['vid']['field'] = 'vid';
$handler->display->display_options['filters']['vid']['value'] = array(
  10 => '10',
  11 => '11',
  12 => '12',
  13 => '13',
  14 => '14',
  15 => '15',
);

/* Display: TaxonomyTerms */
$handler = $view->new_display('services', 'TaxonomyTerms', 'tax_terms');
$handler->display->display_options['defaults']['pager'] = FALSE;
$handler->display->display_options['pager']['type'] = 'none';
$handler->display->display_options['pager']['options']['offset'] = '0';
$handler->display->display_options['path'] = 'tax-terms';
$translatables['bandi_rest_terms'] = array(
  t('Master'),
  t('more'),
  t('Apply'),
  t('Ripristina'),
  t('Sort by'),
  t('Asc'),
  t('Desc'),
  t('Items per page'),
  t('- All -'),
  t('Offset'),
  t('« prima'),
  t('‹ precedente'),
  t('seguente ›'),
  t('ultima »'),
  t('term_id'),
  t('.'),
  t('name'),
  t('vocabulary'),
  t('TaxonomyTerms'),
);
   


Indirizzi url :

cineca_migrate_announcements:

cineca_migrate_taxonomies:

...

Code Block
languageyml
themeConfluence
titlebandi_file
linenumberstrue
collapsetrue
# id deve essere identico all'ultima parte del nome del file (migrate_plus.migration.bandi_file.yml)
# Per la migrazione dei file sono necessari 3 campi 
# - filename che serve per poterlo manipolare insieme ad un path di nostra scelta (l'ho messo nelle costanti) per salvarlo nel nostro file system
# - filepath (url preferibilmente absolute) della posizione del file fisico che vogliamo importare
# - file_id (occorre averlo sempre, perché migration lo mappa insieme al nuovo id che li darà una volta importato)
# utile per poterlo usare in altre migrazioni con il plugin migration_lookup, per i rollback, etc.
id: bandi_file
label: "Bando (File) from d7, json source"
migration_group: bandi_group
# La migrazione viene divisa in 3 parti (source, process, destination)
# ognuna di queste ha delle particolarità
source:
  # possono essere usate delle costanti, qui il modo per poterle dichiarare
  constants:
    DRUPAL_FILE_DIRECTORY: 'public://bandi/'
  plugin: url
  data_fetcher_plugin: file
  data_parser_plugin: json
  urls:
    - sites/default/files/migrations/bandi.json
  # serve per distinguere i livelli
  item_selector: '/Bandi'
  # in fields viene definita la mappatura del campo trovato in sorgente, con come lo si voglia usare qui
  # selector la chiave trovata nel file json
  # name il nome con il quale intendiamo usarlo qui.
  fields:
    - 
      name: src_file_id
      label: 'Photo ID'
      selector: file_id
    - 
      name: src_filename
      label: 'filename'
      selector: filename
    - 
      name: src_filepath
      label: 'File path'
      selector: filepath
  ids:
	# obbligatorio, questo il modulo migration lo utilizza per la tabella che crea (migration_map_bandi_file) per popolare la colonna sourceId1
    src_file_id:
      type: string
process:
  # pseudo field, qui creiamo il filepath completo (vogliamo che finisca nel nostro file system es. public://bandi/filename.pdf)
  psf_destination_full_path:
    - 
      plugin: concat
      source:
        - constants/DRUPAL_FILE_DIRECTORY
        - src_filename
    - 
      plugin: urlencode
  # la vera copia
  uri:
	# questo plugin fa si che non venga interotta la migrazione se filepath del file sorgente è vuota
    - 
      plugin: skip_on_empty
      source: src_filepath
      method: row
      message: 'Cannot import empty document.'
	# questo plugin controlla se il filepath dato corrisponde veramente ad un file, altrimenti non blocca la migrazione, salta solo questo file
    - 
      plugin: skip_on_404
      source: src_filepath
      method: row
	# infine la vera copia dal url della sorgente al nostro file system grazie al pseudo campo (psf_destination_full_path [nome arbitrario]) 
    - 
      plugin: file_copy
      source:
        - src_filepath
        - '@psf_destination_full_path'
      file_exists: 'replace'
# la destinazione è la entity:file, viene salvato nel file system, registrato in DB nel table file_managed, mostrato in backend in content > files
destination:
  plugin: 'entity:file'
migration_dependencies: {}
dependencies:
  enforced:
    module:
      - cineca_migrate_announcements

Code Block
languageyml
themeConfluence
titlebandi_file_media
linenumberstrue
collapsetrue
#
# psf_destination_filename
#   plugin: basename di src_filepath (public://filename.pdf  diventa filename.pdf)
# psf_destination_full_path
#   plugin: concat di psf_destination_filename con DRUPAL_FILE_DIRECTORY (diventa public://bandi/filename.pdf)
#   plugin: urlencode (ritorna una stringa dove tutti i caratteri non alfanumerici sono sostituiti con (%) ) 
#   plugin: skip_on_empty salta l'importazione se non trova il file nel file system locale (public://bandi/filename.pdf)
# field_media_document/target_id
#   plugin: migration_lookup [cerca in migration_map di bandi_file  source_id = src_file_id] ed associa la ID di DB:file_managed
# field_media_document/description:
#   plugin: migration_lookup [cerca in migration_map di bandi_file  source_id = src_file_id] ed associa la ID di DB:file_managed
#
# Per importare l'ordine sarebbe :
#   - bandi_file
#   - bandi_file_media
#
# Per rollback l'ordine è inverso:
#   - bandi_file_media
#   - bandi_file
#
#
id: bandi_file_media
label: "Bando (Media) from d7, json source"
migration_group: bandi_group
source:
  constants:
    DRUPAL_FILE_DIRECTORY: 'public://bandi/'
    USER: '1'
  plugin: url
  data_fetcher_plugin: file
  data_parser_plugin: json
  urls:
    - sites/default/files/migrations/bandi.json
  item_selector: '/Bandi'
  fields:
    - 
      name: src_file_id
      label: 'Photo ID'
      selector: file_id
    - 
      name: src_filename
      label: 'filename'
      selector: filename
    - 
      name: src_filelabel
      label: 'File label'
      selector: filelabel
  ids:
    src_file_id:
      type: string
process:
  # in questo caso, visto che il file l'ho già importato nel nostro file system con bandi_file migration, controllo che sia presente nel nostro file system
  # quindi qui creo un pseudo campo con l'uri completo per il file nel nostro file system
  _document:
    - 
      plugin: concat
      source:
        - constants/DRUPAL_FILE_DIRECTORY
        - src_filename
    - 
      plugin: urlencode
  # importo il name
  name: src_filename
  # imposto il target_id del media document in base a quello assegnato al file (fid:file_managed) 
  field_media_document/target_id:
    -
      plugin: skip_on_404
      method: row
      source: '@_document'
    -
      plugin: migration_lookup
      migration: bandi_file
      source: src_file_id
      no_stub: true
  # importo la descri
  field_media_document/description: src_filelabel
  uid: constants/USER
destination:
  plugin: 'entity:media'
  default_bundle: document
migration_dependencies:
  required:
    - bandi_file
dependencies:
  enforced:
    module:
      - cineca_migrate_announcements
Code Block
languageyml
themeConfluence
titlebandi
linenumberstrue
collapsetrue
#
# Il file di migrazione principale, migrazione di Bandi (CT) da Json.
# Questa migrazione ha una serie di sottoprocessi che vanno eseguiti prima
# che venga eseguita questa. 
# - bandi_file
# - bandi_file_media
# - 
#
#
#
id: bandi
label: "Bandi d7, json source"
migration_group: bandi_group
source:
  constants:
    DRUPAL_FILE_DIRECTORY: 'public://bandi/'
  plugin: url
  data_fetcher_plugin: file
  data_parser_plugin: json
  urls:
    - sites/default/files/migrations/bandi.json
  item_selector: '/Bandi'
  fields:
    - 
      name: src_nid
      label: 'Node Id'
      selector: nid
    -
      name: src_title
      label: 'Titolo'
      selector: titolo
    -
      name: src_body
      label: 'Body'
      selector: descrizione
    -
      name: src_alias
      label: 'Path alias'
      selector: percorso
    - 
      name: src_status
      label: 'Pubblicato'
      selector: pubblicato
    -
      name: src_pub_date
      label: 'Data di pubblicazione'
      selector: pubblication_date
    - 
      name: src_end_pub_date
      label: 'Data di scadenza'
      selector: end_publication_date
    - 
      name: src_orario
      label: 'Orario'
      selector: orario
    -
      name: src_espletato
      label: 'Bando espletato'
      selector: bando_espletato
    -
      name: src_paragraph_txt
      label: 'Paragrafi in testo'
      selector: paragrph
    - 
      name: src_dipartimento_bando
      label: 'dipartimento bando'
      selector: dipartimento_bando
    -
      name : src_tax_categoria_bando_term
      selector: tax_categoria_bando_term
    -
      name : src_tax_doc_e_ricerc_term
      selector: tax_doc_e_ricerc_term
    -
      name: src_tax_bandi_pta_term
      selector: tax_bandi_pta_term
    -
      name: src_tax_bandi_di_gara_term
      selector: tax_bandi_di_gara_term
    -
      name: src_tax_bandi_per_studenti_term
      selector: tax_bandi_per_studenti_term
    -
      name: src_tax_altri_bandi_term
      selector: tax_altri_bandi_term
    - 
      name: src_fid
      label: 'File ID'
      selector: file_id
    - 
      name: src_filename
      label: 'File name'
      selector: filename
    - 
      name: src_fileparh
      label: 'File path'
      selector: filepath
    - 
      name: src_filelabel
      label: 'File label'
      selector: filelabel
    -
      name: src_paragraphs_text
      selector: paragrph
  ids:
    src_nid:
      type: string
destination:
  plugin: 'entity:node'
  default_bundle: bando
process:
  title: src_title
  # in questo caso la migrazione porta la stringa html con links assoluti, quindi utilizzo i plugin dom, dom_str_replace per renderli relativi
  body/value:
    -
      plugin: dom
      method: import
      source: src_body
    - 
      plugin: dom_str_replace
      mode: attribute
      xpath: '//a'
      attribute_options:
        name: href
      search: 'http://default.uniss.d7cl2.pp.private.cineca.it/'
      replace: '/'
    - 
      plugin: dom_str_replace
      mode: attribute
      xpath: '//a'
      attribute_options:
        name: href
      search: 'https://www.uniss.it/'
      replace: '/'
    -
      plugin: dom
      method: export
  body/format:
    plugin: default_value
    default_value: full_html
  # nonnostante la data sorgente e solo data, ma services quando espone il Json lo espone sempre con tempo 00:00:00, occhio all'attributo from_format
  field_publish_date/value:
    plugin: format_date
    source: src_pub_date
    from_format: 'Y-m-d H:i:s'
    to_format: 'Y-m-d'
  field_deadline_date/value:
    plugin: format_date
    source: src_end_pub_date
    from_format: 'Y-m-d H:i:s'
    to_format: 'Y-m-d'
  field_orario: src_orario
  # campo list(integer), cardinalità multipla. Il dato lo ricevo come stringa (A,B,C). Qui prima uso i plugin explode,single_value,multiple_values per importare correttamente.
  field_dipartimento_bando:
    - 
      plugin: explode
      source: src_dipartimento_bando
      delimiter: ','
    - plugin: single_value
    - plugin: multiple_values
  # Per le tassonomie, fa leva alla migrazione di queste grazie al modulo cineca_migrate_taxonomies, così le importa correttamente
  field_tr_altri_bandi:
    plugin: migration_lookup
    migration: tax_altri_bandi_term
    source: src_tax_altri_bandi_term
  field_bandi_di_gara:
    plugin: migration_lookup
    migration: tax_bandi_di_gara_term
    source: src_tax_bandi_di_gara_term
  field_tr_bandi_per_docenti:
    plugin: migration_lookup
    migration: tax_doc_e_ricerc_term
    source: src_tax_doc_e_ricerc_term
  field_tr_bandi_personale:
    plugin: migration_lookup
    migration: tax_bandi_pta_term
    source: src_tax_bandi_pta_term
  field_tr_bandi_per_studenti:
    plugin: migration_lookup
    migration: tax_bandi_per_studenti_term
    source: src_tax_bandi_per_studenti_term
  field_categoria_bando:
    plugin: migration_lookup
    migration: tax_categoria_bando_term
    source: src_tax_categoria_bando_term
  field_bando_archiviato: src_espletato
  _document:
    - 
      plugin: concat
      source:
        - constants/DRUPAL_FILE_DIRECTORY
        - src_filename
    - 
      plugin: urlencode
  field_file_bando/target_id:
    -
      plugin: skip_on_404
      method: row
      source: '@_document'
    -
      plugin: migration_lookup
      migration: bandi_file_media
      source: src_fid
      no_stub: true
  field_paragrafi_importati/value:
    -
      plugin: dom
      method: import
      source: src_paragraphs_text
    - 
      plugin: dom_str_replace
      mode: attribute
      xpath: '//a'
      attribute_options:
        name: href
      search: 'http://default.uniss.d7cl2.pp.private.cineca.it/'
      replace: '/'
    - 
      plugin: dom_str_replace
      mode: attribute
      xpath: '//a'
      attribute_options:
        name: href
      search: 'https://www.uniss.it/'
      replace: '/'
    -
      plugin: dom
      method: export
  field_paragrafi_importati/format:
    plugin: default_value
    default_value: full_html
  status:
    plugin: str_replace
    search: 'Sì'
    replace: '1'
    source: src_status
  path/alias: src_alias
  path/pathauto:
    plugin: default_value
    default_value: false
migration_dependencies:
  required:
    - bandi_file_media
dependencies:
  enforced:
    module:
      - cineca_migrate_announcements

...