diff --git a/demo/demo.sql b/demo/demo.sql index c01cc5a..53766f1 100644 --- a/demo/demo.sql +++ b/demo/demo.sql @@ -234,88 +234,910 @@ values (82, 'en', 'Max. 5 pax') ; alter table campsite alter column campsite_id restart with 82; -select add_campsite(72, '2'); -select add_campsite(72, '3'); -select add_campsite(72, '4'); -select add_campsite(72, '5'); -select add_campsite(72, '6'); -select add_campsite(72, '7'); -select add_campsite(72, '8'); -select add_campsite(72, '9'); -select add_campsite(72, '10'); -select add_campsite(72, '11'); -select add_campsite(72, '12'); -select add_campsite(72, '14'); -select add_campsite(72, '15'); -select add_campsite(72, '16'); -select add_campsite(72, '17'); -select add_campsite(72, '18'); -select add_campsite(72, '19'); -select add_campsite(72, '20'); -select add_campsite(72, '21'); -select add_campsite(72, '22'); -select add_campsite(72, '23'); -select add_campsite(72, '24'); -select add_campsite(72, '25'); -select add_campsite(72, '26'); -select add_campsite(72, '27'); -select add_campsite(72, '28'); -select add_campsite(72, '29'); -select add_campsite(72, '42'); -select add_campsite(72, '43'); -select add_campsite(72, '44'); -select add_campsite(72, '45'); -select add_campsite(72, '46'); -select add_campsite(72, '47'); -select add_campsite(72, '48'); -select add_campsite(72, '50'); -select add_campsite(72, '51'); -select add_campsite(72, '52'); -select add_campsite(72, '53'); -select add_campsite(72, '54'); -select add_campsite(72, '55'); -select add_campsite(72, '56'); -select add_campsite(72, '57'); -select add_campsite(72, '58'); -select add_campsite(72, '59'); -select add_campsite(72, '60'); -select add_campsite(72, '61'); -select add_campsite(72, '62'); -select add_campsite(72, '63'); -select add_campsite(72, '64'); -select add_campsite(72, '65'); -select add_campsite(72, '69'); -select add_campsite(72, '70'); -select add_campsite(72, '71'); -select add_campsite(72, '72'); -select add_campsite(72, '73'); -select add_campsite(72, '74'); -select add_campsite(72, '75'); -select add_campsite(72, '76'); -select add_campsite(72, '77'); -select add_campsite(73, '78'); -select add_campsite(72, '79'); -select add_campsite(72, '80'); -select add_campsite(72, '81'); -select add_campsite(72, '82'); -select add_campsite(72, '83'); -select add_campsite(76, '84'); -select add_campsite(76, '85'); -select add_campsite(72, '89'); -select add_campsite(72, '90'); -select add_campsite(72, '91'); -select add_campsite(72, '92'); -select add_campsite(72, '93'); -select add_campsite(72, '94'); -select add_campsite(72, '95'); -select add_campsite(72, '96'); -select add_campsite(72, '97'); -select add_campsite(72, '98'); -select add_campsite(72, 'B1'); -select add_campsite(72, 'D1'); -select add_campsite(72, 'D2'); -select add_campsite(72, 'D3'); -select add_campsite(72, 'D4'); +select add_campsite(72, '2', '
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '3', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '4', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '5', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '7', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '8', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '9', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '10', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '11', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '14', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '15', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '16', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '17', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '18', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '19', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '20', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '21', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '22', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '23', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '24', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '25', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '26', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '27', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '28', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '29', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '42', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '43', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '44', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '45', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '46', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '47', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '48', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '50', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '51', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '52', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '53', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '54', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '55', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '56', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '57', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '58', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '59', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '60', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '61', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '62', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '63', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '64', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '65', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '69', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '70', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '71', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '72', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '73', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '74', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '75', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '76', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '77', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(73, '78', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '79', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '80', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '81', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '82', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '83', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(76, '84', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(76, '85', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '89', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '90', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '91', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '92', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '93', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '94', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '95', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '96', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '97', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, '98', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, 'B1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, 'D1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, 'D2', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, 'D3', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); +select add_campsite(72, 'D4', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec scelerisque lorem vestibulum enim sollicitudin ornare. Aliquam egestas pretium porttitor. Donec iaculis tempus est, id lobortis risus semper vel. Maecenas ut imperdiet neque. Donec mattis purus felis, vitae interdum risus egestas pharetra. Vestibulum dui neque, condimentum ultrices erat sed, fringilla pharetra ante. Maecenas hendrerit neque mattis risus consectetur euismod. Cras urna metus, bibendum a neque sed, pharetra commodo magna.
'); + +select add_campsite_carousel_slide(72, '2', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '2', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '2', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '2', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '2', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '2', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '3', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '3', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '3', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '3', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '3', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '3', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '4', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '4', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '4', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '4', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '4', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '4', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '5', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '5', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '5', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '5', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '5', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '5', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '6', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '6', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '6', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '6', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '6', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '6', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '7', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '7', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '7', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '7', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '7', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '7', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '8', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '8', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '8', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '8', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '8', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '8', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '9', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '9', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '9', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '9', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '9', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '9', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '10', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '10', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '10', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '10', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '10', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '10', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '11', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '11', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '11', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '11', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '11', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '11', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '12', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '12', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '12', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '12', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '12', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '12', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '14', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '14', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '14', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '14', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '14', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '14', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '15', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '15', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '15', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '15', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '15', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '15', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '16', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '16', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '16', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '16', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '16', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '16', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '17', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '17', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '17', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '17', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '17', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '17', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '18', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '18', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '18', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '18', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '18', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '18', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '19', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '19', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '19', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '19', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '19', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '19', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '20', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '20', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '20', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '20', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '20', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '20', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '21', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '21', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '21', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '21', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '21', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '21', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '22', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '22', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '22', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '22', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '22', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '22', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '23', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '23', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '23', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '23', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '23', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '23', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '24', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '24', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '24', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '24', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '24', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '24', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '25', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '25', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '25', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '25', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '25', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '25', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '26', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '26', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '26', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '26', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '26', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '26', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '27', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '27', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '27', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '27', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '27', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '27', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '28', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '28', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '28', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '28', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '28', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '28', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '29', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '29', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '29', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '29', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '29', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '29', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '42', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '42', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '42', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '42', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '42', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '42', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '43', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '43', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '43', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '43', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '43', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '43', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '44', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '44', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '44', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '44', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '44', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '44', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '45', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '45', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '45', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '45', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '45', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '45', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '46', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '46', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '46', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '46', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '46', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '46', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '47', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '47', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '47', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '47', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '47', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '47', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '48', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '48', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '48', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '48', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '48', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '48', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '50', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '50', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '50', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '50', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '50', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '50', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '51', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '51', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '51', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '51', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '51', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '51', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '52', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '52', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '52', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '52', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '52', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '52', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '53', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '53', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '53', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '53', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '53', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '53', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '54', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '54', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '54', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '54', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '54', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '54', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '55', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '55', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '55', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '55', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '55', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '55', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '56', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '56', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '56', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '56', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '56', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '56', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '57', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '57', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '57', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '57', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '57', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '57', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '58', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '58', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '58', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '58', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '58', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '58', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '59', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '59', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '59', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '59', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '59', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '59', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '60', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '60', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '60', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '60', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '60', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '60', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '61', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '61', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '61', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '61', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '61', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '61', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '62', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '62', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '62', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '62', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '62', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '62', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '63', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '63', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '63', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '63', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '63', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '63', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '64', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '64', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '64', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '64', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '64', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '64', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '65', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '65', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '65', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '65', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '65', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '65', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '69', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '69', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '69', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '69', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '69', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '69', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '70', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '70', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '70', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '70', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '70', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '70', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '71', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '71', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '71', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '71', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '71', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '71', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '72', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '72', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '72', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '72', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '72', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '72', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '73', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '73', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '73', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '73', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '73', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '73', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '74', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '74', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '74', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '74', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '74', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '74', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '75', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '75', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '75', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '75', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '75', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '75', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '76', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '76', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '76', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '76', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '76', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '76', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '77', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '77', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '77', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '77', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '77', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '77', 85, 'Llegenda'); +select add_campsite_carousel_slide(73, '78', 80, 'Llegenda'); +select add_campsite_carousel_slide(73, '78', 81, 'Llegenda'); +select add_campsite_carousel_slide(73, '78', 82, 'Llegenda'); +select add_campsite_carousel_slide(73, '78', 83, 'Llegenda'); +select add_campsite_carousel_slide(73, '78', 84, 'Llegenda'); +select add_campsite_carousel_slide(73, '78', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '79', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '79', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '79', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '79', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '79', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '79', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '80', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '80', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '80', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '80', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '80', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '80', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '81', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '81', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '81', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '81', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '81', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '81', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '82', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '82', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '82', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '82', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '82', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '82', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '83', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '83', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '83', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '83', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '83', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '83', 85, 'Llegenda'); +select add_campsite_carousel_slide(76, '84', 80, 'Llegenda'); +select add_campsite_carousel_slide(76, '84', 81, 'Llegenda'); +select add_campsite_carousel_slide(76, '84', 82, 'Llegenda'); +select add_campsite_carousel_slide(76, '84', 83, 'Llegenda'); +select add_campsite_carousel_slide(76, '84', 84, 'Llegenda'); +select add_campsite_carousel_slide(76, '84', 85, 'Llegenda'); +select add_campsite_carousel_slide(76, '85', 80, 'Llegenda'); +select add_campsite_carousel_slide(76, '85', 81, 'Llegenda'); +select add_campsite_carousel_slide(76, '85', 82, 'Llegenda'); +select add_campsite_carousel_slide(76, '85', 83, 'Llegenda'); +select add_campsite_carousel_slide(76, '85', 84, 'Llegenda'); +select add_campsite_carousel_slide(76, '85', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '89', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '89', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '89', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '89', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '89', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '89', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '90', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '90', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '90', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '90', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '90', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '90', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '91', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '91', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '91', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '91', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '91', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '91', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '92', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '92', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '92', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '92', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '92', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '92', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '93', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '93', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '93', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '93', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '93', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '93', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '94', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '94', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '94', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '94', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '94', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '94', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '95', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '95', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '95', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '95', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '95', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '95', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '96', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '96', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '96', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '96', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '96', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '96', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '97', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '97', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '97', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '97', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '97', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '97', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, '98', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, '98', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, '98', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, '98', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, '98', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, '98', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, 'B1', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, 'B1', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, 'B1', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, 'B1', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, 'B1', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, 'B1', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D1', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D1', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D1', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D1', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D1', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D1', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D2', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D2', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D2', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D2', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D2', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D2', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D3', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D3', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D3', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D3', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D3', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D3', 85, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D4', 80, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D4', 81, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D4', 82, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D4', 83, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D4', 84, 'Llegenda'); +select add_campsite_carousel_slide(72, 'D4', 85, 'Llegenda'); + +select add_campsite_feature(72, '2', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '2', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '2', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '2', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '3', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '3', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '3', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '3', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '4', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '4', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '4', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '4', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '5', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '5', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '5', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '5', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '6', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '6', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '6', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '6', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '7', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '7', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '7', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '7', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '8', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '8', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '8', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '8', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '9', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '9', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '9', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '9', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '10', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '10', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '10', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '10', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '11', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '11', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '11', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '11', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '12', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '12', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '12', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '12', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '14', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '14', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '14', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '14', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '15', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '15', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '15', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '15', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '16', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '16', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '16', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '16', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '17', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '17', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '17', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '17', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '18', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '18', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '18', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '18', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '19', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '19', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '19', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '19', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '20', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '20', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '20', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '20', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '21', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '21', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '21', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '21', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '22', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '22', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '22', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '22', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '23', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '23', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '23', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '23', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '24', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '24', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '24', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '24', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '25', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '25', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '25', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '25', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '26', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '26', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '26', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '26', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '27', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '27', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '27', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '27', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '28', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '28', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '28', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '28', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '29', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '29', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '29', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '29', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '42', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '42', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '42', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '42', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '43', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '43', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '43', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '43', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '44', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '44', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '44', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '44', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '45', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '45', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '45', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '45', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '46', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '46', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '46', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '46', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '47', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '47', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '47', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '47', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '48', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '48', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '48', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '48', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '50', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '50', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '50', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '50', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '51', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '51', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '51', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '51', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '52', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '52', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '52', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '52', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '53', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '53', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '53', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '53', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '54', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '54', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '54', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '54', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '55', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '55', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '55', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '55', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '56', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '56', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '56', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '56', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '57', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '57', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '57', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '57', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '58', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '58', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '58', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '58', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '59', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '59', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '59', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '59', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '60', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '60', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '60', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '60', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '61', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '61', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '61', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '61', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '62', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '62', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '62', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '62', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '63', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '63', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '63', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '63', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '64', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '64', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '64', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '64', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '65', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '65', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '65', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '65', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '69', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '69', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '69', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '69', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '70', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '70', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '70', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '70', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '71', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '71', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '71', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '71', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '72', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '72', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '72', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '72', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '73', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '73', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '73', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '73', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '74', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '74', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '74', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '74', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '75', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '75', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '75', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '75', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '76', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '76', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '76', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '76', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '77', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '77', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '77', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '77', 'shower', 'Accés als serveis'); +select add_campsite_feature(73, '78', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(73, '78', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(73, '78', 'electricity', 'Electricitat'); +select add_campsite_feature(73, '78', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '79', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '79', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '79', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '79', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '80', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '80', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '80', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '80', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '81', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '81', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '81', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '81', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '82', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '82', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '82', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '82', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '83', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '83', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '83', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '83', 'shower', 'Accés als serveis'); +select add_campsite_feature(76, '84', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(76, '84', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(76, '84', 'electricity', 'Electricitat'); +select add_campsite_feature(76, '84', 'shower', 'Accés als serveis'); +select add_campsite_feature(76, '85', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(76, '85', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(76, '85', 'electricity', 'Electricitat'); +select add_campsite_feature(76, '85', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '89', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '89', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '89', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '89', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '90', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '90', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '90', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '90', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '91', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '91', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '91', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '91', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '92', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '92', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '92', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '92', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '93', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '93', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '93', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '93', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '94', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '94', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '94', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '94', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '95', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '95', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '95', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '95', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '96', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '96', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '96', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '96', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '97', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '97', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '97', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '97', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, '98', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, '98', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, '98', 'electricity', 'Electricitat'); +select add_campsite_feature(72, '98', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, 'B1', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, 'B1', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, 'B1', 'electricity', 'Electricitat'); +select add_campsite_feature(72, 'B1', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, 'D1', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, 'D1', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, 'D1', 'electricity', 'Electricitat'); +select add_campsite_feature(72, 'D1', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, 'D2', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, 'D2', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, 'D2', 'electricity', 'Electricitat'); +select add_campsite_feature(72, 'D2', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, 'D3', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, 'D3', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, 'D3', 'electricity', 'Electricitat'); +select add_campsite_feature(72, 'D3', 'shower', 'Accés als serveis'); +select add_campsite_feature(72, 'D4', 'person', 'Máx. 6 pers.'); +select add_campsite_feature(72, 'D4', 'area', 'de 55 a 65 m²'); +select add_campsite_feature(72, 'D4', 'electricity', 'Electricitat'); +select add_campsite_feature(72, 'D4', 'shower', 'Accés als serveis'); alter table service alter column service_id restart with 82; insert into service (company_id, icon_name, name, description) diff --git a/deploy/add_campsite.sql b/deploy/add_campsite.sql index 046bfbe..c1fdf34 100644 --- a/deploy/add_campsite.sql +++ b/deploy/add_campsite.sql @@ -8,13 +8,15 @@ begin; set search_path to camper, public; -create or replace function add_campsite(campsite_type integer, label text) returns integer as +drop function if exists add_campsite(integer, text); + +create or replace function add_campsite(campsite_type integer, label text, info1 text, info2 text) returns integer as $$ declare cid integer; begin - insert into campsite (company_id, campsite_type_id, label) - select company_id, campsite_type_id, label + insert into campsite (company_id, campsite_type_id, label, info1, info2) + select company_id, campsite_type_id, label, xmlparse(content info1), xmlparse(content info2) from campsite_type where campsite_type_id = add_campsite.campsite_type returning campsite_id into cid @@ -28,7 +30,7 @@ $$ language plpgsql ; -revoke execute on function add_campsite(integer, text) from public; -grant execute on function add_campsite(integer, text) to admin; +revoke execute on function add_campsite(integer, text, text, text) from public; +grant execute on function add_campsite(integer, text, text, text) to admin; commit; diff --git a/deploy/add_campsite@v1.sql b/deploy/add_campsite@v1.sql new file mode 100644 index 0000000..046bfbe --- /dev/null +++ b/deploy/add_campsite@v1.sql @@ -0,0 +1,34 @@ +-- Deploy camper:add_campsite to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite +-- requires: campsite_type + +begin; + +set search_path to camper, public; + +create or replace function add_campsite(campsite_type integer, label text) returns integer as +$$ +declare + cid integer; +begin + insert into campsite (company_id, campsite_type_id, label) + select company_id, campsite_type_id, label + from campsite_type + where campsite_type_id = add_campsite.campsite_type + returning campsite_id into cid + ; + if cid is null then + raise foreign_key_violation using message = 'insert or update on table "campsite" violates foreign key constraint "campsite_campsite_type_id_fkey"'; + end if; + return cid; +end +$$ + language plpgsql +; + +revoke execute on function add_campsite(integer, text) from public; +grant execute on function add_campsite(integer, text) to admin; + +commit; diff --git a/deploy/add_campsite_carousel_slide.sql b/deploy/add_campsite_carousel_slide.sql new file mode 100644 index 0000000..96c3434 --- /dev/null +++ b/deploy/add_campsite_carousel_slide.sql @@ -0,0 +1,29 @@ +-- Deploy camper:add_campsite_carousel_slide to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite +-- requires: campsite_carousel + +begin; + +set search_path to camper, public; + +create or replace function add_campsite_carousel_slide(company_id integer, label text, media_id integer, caption text) returns integer as +$$ + insert into campsite_carousel (campsite_id, media_id, caption) + select campsite_id, media_id, coalesce(caption, '') + from campsite + where label = add_campsite_carousel_slide.label + and company_id = add_campsite_carousel_slide.company_id + on conflict (campsite_id, media_id) do update + set caption = excluded.caption + returning campsite_id + ; +$$ + language sql +; + +revoke execute on function add_campsite_carousel_slide(integer, text, integer, text) from public; +grant execute on function add_campsite_carousel_slide(integer, text, integer, text) to admin; + +commit; diff --git a/deploy/add_campsite_feature.sql b/deploy/add_campsite_feature.sql new file mode 100644 index 0000000..f7a50e4 --- /dev/null +++ b/deploy/add_campsite_feature.sql @@ -0,0 +1,27 @@ +-- Deploy camper:add_campsite_feature to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_feature +-- requires: campsite + +begin; + +set search_path to camper, public; + +create or replace function add_campsite_feature(company_id integer, campsite_label text, icon_name text, name text) returns integer as +$$ + insert into campsite_feature (campsite_id, icon_name, name) + select campsite_id, icon_name, add_campsite_feature.name + from campsite + where label = campsite_label + and company_id = add_campsite_feature.company_id + returning campsite_feature_id + ; +$$ + language sql +; + +revoke execute on function add_campsite_feature(integer, text, text, text) from public; +grant execute on function add_campsite_feature(integer, text, text, text) to admin; + +commit; diff --git a/deploy/campsite__info.sql b/deploy/campsite__info.sql new file mode 100644 index 0000000..cd9525a --- /dev/null +++ b/deploy/campsite__info.sql @@ -0,0 +1,11 @@ +-- Deploy camper:campsite__info to pg +-- requires: campsite + +begin; + +alter table camper.campsite + add column info1 xml not null default ''::xml +, add column info2 xml not null default ''::xml +; + +commit; diff --git a/deploy/campsite_carousel.sql b/deploy/campsite_carousel.sql new file mode 100644 index 0000000..bda2422 --- /dev/null +++ b/deploy/campsite_carousel.sql @@ -0,0 +1,56 @@ +-- Deploy camper:campsite_carousel to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite +-- requires: media +-- requires: user_profile + +begin; + +set search_path to camper, public; + +create table campsite_carousel ( + campsite_id integer not null references campsite, + media_id integer not null references media, + caption text not null, + position integer not null default 2147483647, + primary key (campsite_id, media_id) +); + +grant select on table campsite_carousel to guest; +grant select on table campsite_carousel to employee; +grant select, insert, update, delete on table campsite_carousel to admin; + +alter table campsite_carousel enable row level security; + +create policy guest_ok +on campsite_carousel +for select +using (true) +; + +create policy insert_to_company +on campsite_carousel +for insert +with check ( + exists (select 1 from campsite join media using (company_id) join user_profile using (company_id) where campsite.campsite_id = campsite_carousel.campsite_id and media.media_id = campsite_carousel.media_id) +) +; + +create policy update_company +on campsite_carousel +for update +using ( + exists (select 1 from campsite join media using (company_id) join user_profile using (company_id) where campsite.campsite_id = campsite_carousel.campsite_id and media.media_id = campsite_carousel.media_id) +) +; + +create policy delete_from_company +on campsite_carousel +for delete +using ( + exists (select 1 from campsite join media using (company_id) join user_profile using (company_id) where campsite.campsite_id = campsite_carousel.campsite_id and media.media_id = campsite_carousel.media_id) +) +; + +commit; diff --git a/deploy/campsite_carousel_i18n.sql b/deploy/campsite_carousel_i18n.sql new file mode 100644 index 0000000..ccbc676 --- /dev/null +++ b/deploy/campsite_carousel_i18n.sql @@ -0,0 +1,24 @@ +-- Deploy camper:campsite_carousel_i18n to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_carousel +-- requires: language + +begin; + +set search_path to camper, public; + +create table campsite_carousel_i18n ( + campsite_id integer not null, + media_id integer not null, + lang_tag text not null references language, + caption text, + primary key (campsite_id, media_id, lang_tag), + foreign key (campsite_id, media_id) references campsite_carousel +); + +grant select on table campsite_carousel_i18n to guest; +grant select on table campsite_carousel_i18n to employee; +grant select, insert, update, delete on table campsite_carousel_i18n to admin; + +commit; diff --git a/deploy/campsite_feature.sql b/deploy/campsite_feature.sql new file mode 100644 index 0000000..2bfc262 --- /dev/null +++ b/deploy/campsite_feature.sql @@ -0,0 +1,56 @@ +-- Deploy camper:campsite_feature to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite +-- requires: icon +-- requires: user_profile + +begin; + +set search_path to camper, public; + +create table campsite_feature ( + campsite_feature_id integer generated by default as identity primary key, + campsite_id integer not null references campsite, + icon_name text not null references icon, + name text not null constraint name_not_empty check(length(trim(name)) > 0), + position integer not null default 2147483647 +); + +grant select on table campsite_feature to guest; +grant select on table campsite_feature to employee; +grant select, insert, update, delete on table campsite_feature to admin; + +alter table campsite_feature enable row level security; + +create policy guest_ok +on campsite_feature +for select +using (true) +; + +create policy insert_to_company +on campsite_feature +for insert +with check ( + exists (select 1 from campsite join user_profile using (company_id) where campsite.campsite_id = campsite_feature.campsite_id) +) +; + +create policy update_company +on campsite_feature +for update +using ( + exists (select 1 from campsite join user_profile using (company_id) where campsite.campsite_id = campsite_feature.campsite_id) +) +; + +create policy delete_from_company +on campsite_feature +for delete +using ( + exists (select 1 from campsite join user_profile using (company_id) where campsite.campsite_id = campsite_feature.campsite_id) +) +; + +commit; diff --git a/deploy/campsite_feature_i18n.sql b/deploy/campsite_feature_i18n.sql new file mode 100644 index 0000000..c787a72 --- /dev/null +++ b/deploy/campsite_feature_i18n.sql @@ -0,0 +1,22 @@ +-- Deploy camper:campsite_feature_i18n to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_feature +-- requires: language + +begin; + +set search_path to camper, public; + +create table campsite_feature_i18n ( + campsite_feature_id integer not null references campsite_feature, + lang_tag text not null references language, + name text, + primary key (campsite_feature_id, lang_tag) +); + +grant select on table campsite_feature_i18n to guest; +grant select on table campsite_feature_i18n to employee; +grant select, insert, update, delete on table campsite_feature_i18n to admin; + +commit; diff --git a/deploy/campsite_i18n.sql b/deploy/campsite_i18n.sql new file mode 100644 index 0000000..cae02ee --- /dev/null +++ b/deploy/campsite_i18n.sql @@ -0,0 +1,23 @@ +-- Deploy camper:campsite_i18n to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite +-- requires: language + +begin; + +set search_path to camper, public; + +create table campsite_i18n ( + campsite_id integer not null references campsite, + lang_tag text not null references language, + info1 xml, + info2 xml, + primary key (campsite_id, lang_tag) +); + +grant select on campsite_i18n to guest; +grant select on campsite_i18n to employee; +grant select, insert, update, delete on campsite_i18n to admin; + +commit; diff --git a/deploy/edit_campsite.sql b/deploy/edit_campsite.sql index bcaf2d8..35278f9 100644 --- a/deploy/edit_campsite.sql +++ b/deploy/edit_campsite.sql @@ -7,11 +7,15 @@ begin; set search_path to camper, public; -create or replace function edit_campsite(campsite_id integer, campsite_type integer, new_label text, active boolean) returns integer as +drop function edit_campsite(integer, integer, text, boolean); + +create or replace function edit_campsite(campsite_id integer, campsite_type integer, new_label text, new_info1 text, new_info2 text, active boolean) returns integer as $$ update campsite set label = edit_campsite.new_label , campsite_type_id = edit_campsite.campsite_type + , info1 = xmlparse(content new_info1) + , info2 = xmlparse(content new_info2) , active = edit_campsite.active where campsite_id = edit_campsite.campsite_id returning campsite_id; @@ -19,7 +23,7 @@ $$ language sql ; -revoke execute on function edit_campsite(integer, integer, text, boolean) from public; -grant execute on function edit_campsite(integer, integer, text, boolean) to admin; +revoke execute on function edit_campsite(integer, integer, text, text, text, boolean) from public; +grant execute on function edit_campsite(integer, integer, text, text, text, boolean) to admin; commit; diff --git a/deploy/edit_campsite@v1.sql b/deploy/edit_campsite@v1.sql new file mode 100644 index 0000000..bcaf2d8 --- /dev/null +++ b/deploy/edit_campsite@v1.sql @@ -0,0 +1,25 @@ +-- Deploy camper:edit_campsite to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite + +begin; + +set search_path to camper, public; + +create or replace function edit_campsite(campsite_id integer, campsite_type integer, new_label text, active boolean) returns integer as +$$ + update campsite + set label = edit_campsite.new_label + , campsite_type_id = edit_campsite.campsite_type + , active = edit_campsite.active + where campsite_id = edit_campsite.campsite_id + returning campsite_id; +$$ + language sql +; + +revoke execute on function edit_campsite(integer, integer, text, boolean) from public; +grant execute on function edit_campsite(integer, integer, text, boolean) to admin; + +commit; diff --git a/deploy/edit_campsite_feature.sql b/deploy/edit_campsite_feature.sql new file mode 100644 index 0000000..7c02f5a --- /dev/null +++ b/deploy/edit_campsite_feature.sql @@ -0,0 +1,25 @@ +-- Deploy camper:edit_campsite_feature to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_feature + +begin; + +set search_path to camper, public; + +create or replace function edit_campsite_feature(feature_id integer, icon_name text, name text) returns integer as +$$ + update campsite_feature + set icon_name = edit_campsite_feature.icon_name + , name = edit_campsite_feature.name + where campsite_feature_id = feature_id + returning campsite_feature_id + ; +$$ + language sql +; + +revoke execute on function edit_campsite_feature(integer, text, text) from public; +grant execute on function edit_campsite_feature(integer, text, text) to admin; + +commit; diff --git a/deploy/order_campsite_carousel.sql b/deploy/order_campsite_carousel.sql new file mode 100644 index 0000000..1f6e851 --- /dev/null +++ b/deploy/order_campsite_carousel.sql @@ -0,0 +1,27 @@ +-- Deploy camper:order_campsite_carousel to pg +-- requires: roles +-- requires: campsite_carousel +-- requires: campsite + +begin; + +set search_path to camper, public; + +create or replace function order_campsite_carousel(label text, company_id integer, positions integer[]) returns void as +$$ + update campsite_carousel + set position = cast(temp.position as integer) + from unnest(positions) with ordinality as temp(media_id, position) + join campsite on campsite.label = order_campsite_carousel.label + and campsite.company_id = order_campsite_carousel.company_id + where campsite_carousel.campsite_id = campsite.campsite_id + and campsite_carousel.media_id = temp.media_id + ; +$$ + language sql +; + +revoke execute on function order_campsite_carousel(text, integer, integer[]) from public; +grant execute on function order_campsite_carousel(text, integer, integer[]) to admin; + +commit; diff --git a/deploy/order_campsite_features.sql b/deploy/order_campsite_features.sql new file mode 100644 index 0000000..ce8c123 --- /dev/null +++ b/deploy/order_campsite_features.sql @@ -0,0 +1,24 @@ +-- Deploy camper:order_campsite_features to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_feature + +begin; + +set search_path to camper, public; + +create or replace function order_campsite_features(positions integer[]) returns void as +$$ + update campsite_feature + set position = cast(temp.position as integer) + from unnest(positions) with ordinality as temp(feature_id, position) + where campsite_feature_id = temp.feature_id + ; +$$ + language sql +; + +revoke execute on function order_campsite_features(integer[]) from public; +grant execute on function order_campsite_features(integer[]) to admin; + +commit; diff --git a/deploy/remove_campsite_carousel_slide.sql b/deploy/remove_campsite_carousel_slide.sql new file mode 100644 index 0000000..02c0491 --- /dev/null +++ b/deploy/remove_campsite_carousel_slide.sql @@ -0,0 +1,40 @@ +-- Deploy camper:remove_campsite_carousel_slide to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_carousel +-- requires: campsite_carousel_i18n + +begin; + +set search_path to camper, public; + +create or replace function remove_campsite_carousel_slide(company_id integer, label text, media_id integer) returns void as +$$ +declare + csid integer; +begin + select campsite_id + into csid + from campsite + where campsite.label = remove_campsite_carousel_slide.label + and campsite.company_id = remove_campsite_carousel_slide.company_id + ; + + delete from campsite_carousel_i18n + where campsite_id = csid + and campsite_carousel_i18n.media_id = remove_campsite_carousel_slide.media_id + ; + + delete from campsite_carousel + where campsite_id = csid + and campsite_carousel.media_id = remove_campsite_carousel_slide.media_id + ; +end +$$ + language plpgsql +; + +revoke execute on function remove_campsite_carousel_slide(integer, text, integer) from public; +grant execute on function remove_campsite_carousel_slide(integer, text, integer) to admin; + +commit; diff --git a/deploy/remove_campsite_feature.sql b/deploy/remove_campsite_feature.sql new file mode 100644 index 0000000..a6768c8 --- /dev/null +++ b/deploy/remove_campsite_feature.sql @@ -0,0 +1,22 @@ +-- Deploy camper:remove_campsite_feature to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_feature +-- requires: campsite_feature_i18n + +begin; + +set search_path to camper, public; + +create or replace function remove_campsite_feature(feature_id integer) returns void as +$$ + delete from campsite_feature_i18n where campsite_feature_id = feature_id; + delete from campsite_feature where campsite_feature_id = feature_id; +$$ + language sql +; + +revoke execute on function remove_campsite_feature(integer) from public; +grant execute on function remove_campsite_feature(integer) to admin; + +commit; diff --git a/deploy/translate_campsite.sql b/deploy/translate_campsite.sql new file mode 100644 index 0000000..e9d3453 --- /dev/null +++ b/deploy/translate_campsite.sql @@ -0,0 +1,26 @@ +-- Deploy camper:translate_campsite to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_i18n + +begin; + +set search_path to camper, public; + +create or replace function translate_campsite(campsite_id integer, lang_tag text, info1 text, info2 text) returns void as +$$ + insert into campsite_i18n (campsite_id, lang_tag, info1, info2) + values (campsite_id, lang_tag, case trim(info1) when '' then null else xmlparse(content info1) end, case trim(info2) when '' then null else xmlparse(content info2) end) + on conflict (campsite_id, lang_tag) + do update + set info1 = excluded.info1 + , info2 = excluded.info2 + ; +$$ + language sql +; + +revoke execute on function translate_campsite(integer, text, text, text) from public; +grant execute on function translate_campsite(integer, text, text, text) to admin; + +commit; diff --git a/deploy/translate_campsite_carousel_slide.sql b/deploy/translate_campsite_carousel_slide.sql new file mode 100644 index 0000000..8960251 --- /dev/null +++ b/deploy/translate_campsite_carousel_slide.sql @@ -0,0 +1,28 @@ +-- Deploy camper:translate_campsite_carousel_slide to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite +-- requires: campsite_carousel_i18n + +begin; + +set search_path to camper, public; + +create or replace function translate_campsite_carousel_slide(company_id integer, label text, media_id integer, lang_tag text, caption text) returns void as +$$ + insert into campsite_carousel_i18n (campsite_id, media_id, lang_tag, caption) + select campsite_id, translate_campsite_carousel_slide.media_id, lang_tag, case trim(caption) when '' then null else caption end + from campsite + where label = translate_campsite_carousel_slide.label + and company_id = translate_campsite_carousel_slide.company_id + on conflict (campsite_id, media_id, lang_tag) do update + set caption = excluded.caption + ; +$$ + language sql +; + +revoke execute on function translate_campsite_carousel_slide(integer, text, integer, text, text) from public; +grant execute on function translate_campsite_carousel_slide(integer, text, integer, text, text) to admin; + +commit; diff --git a/deploy/translate_campsite_feature.sql b/deploy/translate_campsite_feature.sql new file mode 100644 index 0000000..0e0d51a --- /dev/null +++ b/deploy/translate_campsite_feature.sql @@ -0,0 +1,24 @@ +-- Deploy camper:translate_campsite_feature to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_feature_i18n + +begin; + +set search_path to camper, public; + +create or replace function translate_campsite_feature(feature_id integer, lang_tag text, name text) returns void as +$$ + insert into campsite_feature_i18n (campsite_feature_id, lang_tag, name) + values (feature_id, lang_tag, case trim(name) when '' then null else name end) + on conflict (campsite_feature_id, lang_tag) do update + set name = excluded.name + ; +$$ + language sql +; + +revoke execute on function translate_campsite_feature(integer, text, text) from public; +grant execute on function translate_campsite_feature(integer, text, text) to admin; + +commit; diff --git a/pkg/campsite/admin.go b/pkg/campsite/admin.go index 5d57398..667cbde 100644 --- a/pkg/campsite/admin.go +++ b/pkg/campsite/admin.go @@ -9,6 +9,8 @@ import ( "context" "net/http" + "github.com/jackc/pgx/v4" + "dev.tandem.ws/tandem/camper/pkg/auth" "dev.tandem.ws/tandem/camper/pkg/campsite/types" "dev.tandem.ws/tandem/camper/pkg/database" @@ -37,7 +39,7 @@ func (h *AdminHandler) Handler(user *auth.User, company *auth.Company, conn *dat case "new": switch r.Method { case http.MethodGet: - f := newCampsiteForm(r.Context(), conn) + f := newCampsiteForm(r.Context(), conn, company) f.MustRender(w, r, user, company) default: httplib.MethodNotAllowed(w, r, http.MethodGet) @@ -54,7 +56,7 @@ func (h *AdminHandler) Handler(user *auth.User, company *auth.Company, conn *dat httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPost) } default: - f := newCampsiteForm(r.Context(), conn) + f := newCampsiteForm(r.Context(), conn, company) if err := f.FillFromDatabase(r.Context(), conn, company, head); err != nil { if database.ErrorIsNotFound(err) { http.NotFound(w, r) @@ -74,6 +76,10 @@ func (h *AdminHandler) Handler(user *auth.User, company *auth.Company, conn *dat default: httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut) } + case "slides": + h.carouselHandler(user, company, conn, f.Label.Val).ServeHTTP(w, r) + case "features": + h.featuresHandler(user, company, conn, f.Label.Val).ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -133,17 +139,37 @@ func (page *campsiteIndex) MustRender(w http.ResponseWriter, r *http.Request, us } func addCampsite(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) { - f := newCampsiteForm(r.Context(), conn) + f := newCampsiteForm(r.Context(), conn, company) processCampsiteForm(w, r, user, company, conn, f, func(ctx context.Context, tx *database.Tx) error { - _, err := tx.AddCampsite(r.Context(), f.CampsiteType.String(), f.Label.Val) - return err + var err error + f.ID, err = tx.AddCampsite(ctx, f.CampsiteType.Int(), f.Label.Val, f.Info1[f.DefaultLang].Val, f.Info2[f.DefaultLang].Val) + if err != nil { + return err + } + return translateCampsite(ctx, tx, company, f) }) httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther) } +func translateCampsite(ctx context.Context, tx *database.Tx, company *auth.Company, f *campsiteForm) error { + for lang := range company.Locales { + l := lang.String() + if l == f.DefaultLang { + continue + } + if err := tx.TranslateCampsite(ctx, f.ID, lang, f.Info1[l].Val, f.Info2[l].Val); err != nil { + return err + } + } + return nil +} + func editCampsite(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn, f *campsiteForm) { processCampsiteForm(w, r, user, company, conn, f, func(ctx context.Context, tx *database.Tx) error { - return tx.EditCampsite(r.Context(), f.ID, f.CampsiteType.String(), f.Label.Val, f.Active.Checked) + if err := tx.EditCampsite(ctx, f.ID, f.CampsiteType.Int(), f.Label.Val, f.Info1[f.DefaultLang].Val, f.Info2[f.DefaultLang].Val, f.Active.Checked); err != nil { + return err + } + return translateCampsite(ctx, tx, company, f) }) httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther) } @@ -166,16 +192,20 @@ func processCampsiteForm(w http.ResponseWriter, r *http.Request, user *auth.User } type campsiteForm struct { + DefaultLang string ID int CurrentLabel string Active *form.Checkbox CampsiteType *form.Select Label *form.Input + Info1 form.I18nInput + Info2 form.I18nInput } -func newCampsiteForm(ctx context.Context, conn *database.Conn) *campsiteForm { +func newCampsiteForm(ctx context.Context, conn *database.Conn, company *auth.Company) *campsiteForm { campsiteTypes := form.MustGetOptions(ctx, conn, "select campsite_type_id::text, name from campsite_type where active") return &campsiteForm{ + DefaultLang: company.DefaultLanguage.String(), Active: &form.Checkbox{ Name: "active", Checked: true, @@ -187,20 +217,45 @@ func newCampsiteForm(ctx context.Context, conn *database.Conn) *campsiteForm { Label: &form.Input{ Name: "label", }, + Info1: form.NewI18nInput(company.Locales, "info1"), + Info2: form.NewI18nInput(company.Locales, "info2"), } } func (f *campsiteForm) FillFromDatabase(ctx context.Context, conn *database.Conn, company *auth.Company, label string) error { f.CurrentLabel = label + var info1 database.RecordArray + var info2 database.RecordArray row := conn.QueryRow(ctx, ` select campsite_id , array[campsite_type_id::text] , label + , campsite.info1::text + , campsite.info2::text , active + , array_agg((lang_tag, i18n.info1::text)) + , array_agg((lang_tag, i18n.info2::text)) from campsite + left join campsite_i18n as i18n using (campsite_id) where company_id = $1 - and label = $2`, company.ID, label) - return row.Scan(&f.ID, &f.CampsiteType.Selected, &f.Label.Val, &f.Active.Checked) + and label = $2 + group by campsite_id + , campsite_type_id + , label + , campsite.info1::text + , campsite.info2::text + , active + `, pgx.QueryResultFormats{pgx.BinaryFormatCode}, company.ID, label) + if err := row.Scan(&f.ID, &f.CampsiteType.Selected, &f.Label.Val, &f.Info1[f.DefaultLang].Val, &f.Info2[f.DefaultLang].Val, &f.Active.Checked, &info1, &info2); err != nil { + return err + } + if err := f.Info1.FillArray(info1); err != nil { + return err + } + if err := f.Info2.FillArray(info2); err != nil { + return err + } + return nil } func (f *campsiteForm) Parse(r *http.Request) error { @@ -210,6 +265,8 @@ func (f *campsiteForm) Parse(r *http.Request) error { f.Active.FillValue(r) f.CampsiteType.FillValue(r) f.Label.FillValue(r) + f.Info1.FillValue(r) + f.Info2.FillValue(r) return nil } diff --git a/pkg/campsite/carousel.go b/pkg/campsite/carousel.go new file mode 100644 index 0000000..f961623 --- /dev/null +++ b/pkg/campsite/carousel.go @@ -0,0 +1,339 @@ +/* + * SPDX-FileCopyrightText: 2023 jordi fita masA1.1
', 'A1.2
') $$, 'Should be able to add a campsite to the first company' ); select lives_ok( - $$ select add_campsite(12, 'B1') $$, + $$ select add_campsite(12, 'B1', 'B1.1
', 'B1.2
') $$, 'Should be able to add a campsite to the same company, but of a different type' ); select lives_ok( - $$ select add_campsite(21, 'C1') $$, + $$ select add_campsite(21, 'C1', 'C1.1
', 'C1.2
') $$, 'Should be able to add a campsite to the second company' ); select throws_ok( - $$ select add_campsite(22, 'C1') $$, + $$ select add_campsite(22, 'C1', '', '') $$, '23503', 'insert or update on table "campsite" violates foreign key constraint "campsite_campsite_type_id_fkey"', 'Should raise an error if the campsite type is not valid.' ); select bag_eq( - $$ select company_id, campsite_type_id, label, active from campsite $$, - $$ values (1, 11, 'A1', true) - , (1, 12, 'B1', true) - , (2, 21, 'C1', true) + $$ select company_id, campsite_type_id, label, info1::text, info2::text, active from campsite $$, + $$ values (1, 11, 'A1', 'A1.1
', 'A1.2
', true) + , (1, 12, 'B1', 'B1.1
', 'B1.2
', true) + , (2, 21, 'C1', 'C1.1
', 'C1.2
', true) $$, 'Should have added all campsites' ); diff --git a/test/add_campsite_carousel_slide.sql b/test/add_campsite_carousel_slide.sql new file mode 100644 index 0000000..8d26156 --- /dev/null +++ b/test/add_campsite_carousel_slide.sql @@ -0,0 +1,96 @@ +-- Test add_campsite_carousel_slide +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(13); + +set search_path to camper, public; + +select has_function('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text']); +select function_lang_is('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'sql'); +select function_returns('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'integer'); +select isnt_definer('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text']); +select volatility_is('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'volatile'); +select function_privs_are('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'add_campsite_carousel_slide', array['integer', 'text', 'integer', 'text'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_carousel cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') + , ('text/plain', 'hello, world!') + , ('image/svg+xml', '') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (3, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (4, 2, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) + , (5, 1, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffff00","a"};')) + , (6, 1, 'text.txt', sha256('hello, world!')) + , (7, 1, 'image.svg', sha256('')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, max_campers, dogs_allowed, active) +values (10, 1, 3, 'Type A', 'A
', 5, false, true) + , (11, 2, 4, 'Type A', 'A
', 5, false, true) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (11, 1, 'A1', 10) + , (12, 1, 'Z9', 10) + , (13, 2, 'A1', 11) +; + +insert into campsite_carousel (campsite_id, media_id, caption) +values (11, 5, 'A caption') +; + +select lives_ok( + $$ select add_campsite_carousel_slide(1, 'A1', 6, 'A caption') $$, + 'Should be able to add a carousel slide with a caption' +); + +select lives_ok( + $$ select add_campsite_carousel_slide(1, 'Z9', 7, null) $$, + 'Should be able to add a carousel slide without caption' +); + +select lives_ok( + $$ select add_campsite_carousel_slide(1, 'A1', 5, 'New caption') $$, + 'Should be able to overwrite a slide with a new caption' +); + +select bag_eq( + $$ select campsite_id, media_id, caption from campsite_carousel $$, + $$ values (11, 5, 'New caption') + , (11, 6, 'A caption') + , (12, 7, '') + $$, + 'Should have all three slides' +); + +select * +from finish(); + +rollback; diff --git a/test/add_campsite_feature.sql b/test/add_campsite_feature.sql new file mode 100644 index 0000000..f057db2 --- /dev/null +++ b/test/add_campsite_feature.sql @@ -0,0 +1,77 @@ +-- Test add_campsite_feature +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(12); + +set search_path to camper, public; + +select has_function('camper', 'add_campsite_feature', array['integer', 'text', 'text', 'text']); +select function_lang_is('camper', 'add_campsite_feature', array['integer', 'text', 'text', 'text'], 'sql'); +select function_returns('camper', 'add_campsite_feature', array['integer', 'text', 'text', 'text'], 'integer'); +select isnt_definer('camper', 'add_campsite_feature', array['integer', 'text', 'text', 'text']); +select volatility_is('camper', 'add_campsite_feature', array['integer', 'text', 'text', 'text'], 'volatile'); +select function_privs_are('camper', 'add_campsite_feature', array ['integer', 'text', 'text', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'add_campsite_feature', array ['integer', 'text', 'text', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'add_campsite_feature', array ['integer', 'text', 'text', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'add_campsite_feature', array ['integer', 'text', 'text', 'text'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_feature cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (3, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, active, dogs_allowed, max_campers) +values (4, 1, 3, 'Type A', 'A
', true, false, 4) + , (5, 1, 3, 'Type B', 'B
', true, false, 5) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (6, 1, 'A1', 4) + , (7, 2, 'A1', 5) +; + +select lives_ok( + $$ select add_campsite_feature(1, 'A1', 'wifi', 'Feature 1') $$, + 'Should be able to add an feature to the first campsite' +); + +select lives_ok( + $$ select add_campsite_feature(2, 'A1', 'information', 'Feature 2') $$, + 'Should be able to add an feature to the second campsite' +); + +select bag_eq( + $$ select campsite_id, icon_name, name from campsite_feature $$, + $$ values (6, 'wifi', 'Feature 1') + , (7, 'information', 'Feature 2') + $$, + 'Should have added all two campsite features' +); + +select * +from finish(); + +rollback; diff --git a/test/campsite.sql b/test/campsite.sql index 1507e0a..59b52d2 100644 --- a/test/campsite.sql +++ b/test/campsite.sql @@ -5,7 +5,7 @@ reset client_min_messages; begin; -select plan(47); +select plan(55); set search_path to camper, public; @@ -42,6 +42,18 @@ select col_type_is('campsite', 'label', 'text'); select col_not_null('campsite', 'label'); select col_hasnt_default('campsite', 'label'); +select has_column('campsite', 'info1'); +select col_type_is('campsite', 'info1', 'xml'); +select col_not_null('campsite', 'info1'); +select col_has_default('campsite', 'info1'); +--select col_default_is('campsite', 'info1', ''); + +select has_column('campsite', 'info2'); +select col_type_is('campsite', 'info2', 'xml'); +select col_not_null('campsite', 'info2'); +select col_has_default('campsite', 'info2'); +--select col_default_is('campsite', 'info2', ''); + select has_column('campsite', 'active'); select col_type_is('campsite', 'active', 'boolean'); select col_not_null('campsite', 'active'); diff --git a/test/campsite_carousel.sql b/test/campsite_carousel.sql new file mode 100644 index 0000000..5461461 --- /dev/null +++ b/test/campsite_carousel.sql @@ -0,0 +1,236 @@ +-- Test campsite_carousel +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(45); + +set search_path to camper, public; + +select has_table('campsite_carousel'); +select has_pk('campsite_carousel'); +select col_is_pk('campsite_carousel', array['campsite_id', 'media_id']); +select table_privs_are('campsite_carousel', 'guest', array['SELECT']); +select table_privs_are('campsite_carousel', 'employee', array['SELECT']); +select table_privs_are('campsite_carousel', 'admin', array['SELECT', 'INSERT', 'UPDATE', 'DELETE']); +select table_privs_are('campsite_carousel', 'authenticator', array[]::text[]); + +select has_column('campsite_carousel', 'campsite_id'); +select col_is_fk('campsite_carousel', 'campsite_id'); +select fk_ok('campsite_carousel', 'campsite_id', 'campsite', 'campsite_id'); +select col_type_is('campsite_carousel', 'campsite_id', 'integer'); +select col_not_null('campsite_carousel', 'campsite_id'); +select col_hasnt_default('campsite_carousel', 'campsite_id'); + +select has_column('campsite_carousel', 'media_id'); +select col_is_fk('campsite_carousel', 'media_id'); +select fk_ok('campsite_carousel', 'media_id', 'media', 'media_id'); +select col_type_is('campsite_carousel', 'media_id', 'integer'); +select col_not_null('campsite_carousel', 'media_id'); +select col_hasnt_default('campsite_carousel', 'media_id'); + +select has_column('campsite_carousel', 'caption'); +select col_type_is('campsite_carousel', 'caption', 'text'); +select col_not_null('campsite_carousel', 'caption'); +select col_hasnt_default('campsite_carousel', 'caption'); + +select has_column('campsite_carousel', 'position'); +select col_type_is('campsite_carousel', 'position', 'integer'); +select col_not_null('campsite_carousel', 'position'); +select col_has_default('campsite_carousel', 'position'); +select col_default_is('campsite_carousel', 'position', '2147483647'); + + +set client_min_messages to warning; +truncate campsite_carousel cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company_host cascade; +truncate company_user cascade; +truncate company cascade; +truncate auth."user" cascade; +reset client_min_messages; + + +insert into auth."user" (user_id, email, name, password, cookie, cookie_expires_at) +values (1, 'demo@tandem.blog', 'Demo', 'test', '44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e', current_timestamp + interval '1 month') + , (5, 'admin@tandem.blog', 'Demo', 'test', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') +; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', '', 60, 'FR', 'USD', 'ca') +; + +insert into company_user (company_id, user_id, role) +values (2, 1, 'admin') + , (4, 5, 'admin') +; + +insert into company_host (company_id, host) +values (2, 'co2') + , (4, 'co4') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('text/plain', 'content2') + , ('text/plain', 'content3') + , ('text/plain', 'content4') + , ('text/plain', 'content5') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values ( 6, 2, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , ( 7, 2, 'text2.txt', sha256('content2')) + , ( 8, 2, 'text3.txt', sha256('content3')) + , ( 9, 4, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (10, 4, 'text4.txt', sha256('content4')) + , (11, 4, 'text5.txt', sha256('content5')) +; + +insert into campsite_type (campsite_type_id, company_id, name, media_id, dogs_allowed, max_campers) +values (21, 2, 'Wooden lodge', 6, false, 7) + , (22, 4, 'Bungalow', 9, false, 6) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (23, 2, 'W1', 21) + , (24, 4, 'B1', 22) +; + +insert into campsite_carousel (campsite_id, media_id, caption) +values (23, 7, 'Caption 7') + , (24, 10, 'Caption 10') +; + +prepare carousel_data as +select campsite_id, media_id, caption +from campsite_carousel +; + +set role guest; +select bag_eq( + 'carousel_data', + $$ values (23, 7, 'Caption 7') + , (24, 10, 'Caption 10') + $$, + 'Everyone should be able to list all campsite slides across all companies' +); +reset role; + +select set_cookie('44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog', 'co2'); + +select lives_ok( + $$ insert into campsite_carousel(campsite_id, media_id, caption) values (23, 8, 'Caption 8') $$, + 'Admin from company 2 should be able to insert a new slide to campsites of that company.' +); + +select bag_eq( + 'carousel_data', + $$ values (23, 7, 'Caption 7') + , (23, 8, 'Caption 8') + , (24, 10, 'Caption 10') + $$, + 'The new row should have been added' +); + +select lives_ok( + $$ update campsite_carousel set caption = 'Caption 8.8' where media_id = 8 $$, + 'Admin from company 2 should be able to update campsite slides of that company.' +); + +select bag_eq( + 'carousel_data', + $$ values (23, 7, 'Caption 7') + , (23, 8, 'Caption 8.8') + , (24, 10, 'Caption 10') + $$, + 'The row should have been updated.' +); + +select lives_ok( + $$ delete from campsite_carousel where media_id = 8 $$, + 'Admin from company 2 should be able to delete campsite slides from that company.' +); + +select bag_eq( + 'carousel_data', + $$ values (23, 7, 'Caption 7') + , (24, 10, 'Caption 10') + $$, + 'The row should have been deleted.' +); + +select throws_ok( + $$ insert into campsite_carousel (campsite_id, media_id, caption) values (23, 10, 'Nope') $$, + '42501', 'new row violates row-level security policy for table "campsite_carousel"', + 'Admin from company 2 should NOT be able to insert a new campsites slide from a media of company 4.' +); + +select throws_ok( + $$ insert into campsite_carousel (campsite_id, media_id, caption) values (24, 8, 'Nope') $$, + '42501', 'new row violates row-level security policy for table "campsite_carousel"', + 'Admin from company 2 should NOT be able to insert a slide to a campsite of company 4.' +); + +select lives_ok( + $$ update campsite_carousel set caption = 'Nope' where campsite_id = 24 $$, + 'Admin from company 2 should not be able to update slides of campsites from company 4, but no error if campsite_id or media_id is not changed.' +); + +select lives_ok( + $$ update campsite_carousel set caption = 'Nope' where media_id = 10 $$, + 'Admin from company 2 should not be able to update slides of campsites from company 4, but no error if campsite_id or media_id is not changed.' +); + +select bag_eq( + 'carousel_data', + $$ values (23, 7, 'Caption 7') + , (24, 10, 'Caption 10') + $$, + 'No row should have been changed.' +); + +select throws_ok( + $$ update campsite_carousel set campsite_id = 24 where campsite_id = 23 $$, + '42501', 'new row violates row-level security policy for table "campsite_carousel"', + 'Admin from company 2 should NOT be able to move slides to campsites of company 4' +); + +select throws_ok( + $$ update campsite_carousel set media_id = 11 where media_id = 7 $$, + '42501', 'new row violates row-level security policy for table "campsite_carousel"', + 'Admin from company 2 should NOT be able to use media from company 4' +); + +select lives_ok( + $$ delete from campsite_carousel where campsite_id = 24 $$, + 'Admin from company 2 should NOT be able to delete slides of campsites from company 4, but not error is thrown' +); + +select lives_ok( + $$ delete from campsite_carousel where media_id = 10 $$, + 'Admin from company 2 should NOT be able to delete slides with media from company 4, but not error is thrown' +); + +select bag_eq( + 'carousel_data', + $$ values (23, 7, 'Caption 7') + , (24, 10, 'Caption 10') + $$, + 'No row should have been changed' +); + +reset role; + + +select * +from finish(); + +rollback; + diff --git a/test/campsite_carousel_i18n.sql b/test/campsite_carousel_i18n.sql new file mode 100644 index 0000000..59b90f1 --- /dev/null +++ b/test/campsite_carousel_i18n.sql @@ -0,0 +1,49 @@ +-- Test campsite_carousel_i18n +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(27); + +set search_path to camper, public; + +select has_table('campsite_carousel_i18n'); +select has_pk('campsite_carousel_i18n'); +select col_is_pk('campsite_carousel_i18n', array['campsite_id', 'media_id', 'lang_tag']); +select col_is_fk('campsite_carousel_i18n', array['campsite_id', 'media_id']); +select fk_ok('campsite_carousel_i18n', array['campsite_id', 'media_id'], 'campsite_carousel', array['campsite_id', 'media_id']); +select table_privs_are('campsite_carousel_i18n', 'guest', array['SELECT']); +select table_privs_are('campsite_carousel_i18n', 'employee', array['SELECT']); +select table_privs_are('campsite_carousel_i18n', 'admin', array['SELECT', 'INSERT', 'UPDATE', 'DELETE']); +select table_privs_are('campsite_carousel_i18n', 'authenticator', array[]::text[]); + +select has_column('campsite_carousel_i18n', 'campsite_id'); +select col_type_is('campsite_carousel_i18n', 'campsite_id', 'integer'); +select col_not_null('campsite_carousel_i18n', 'campsite_id'); +select col_hasnt_default('campsite_carousel_i18n', 'campsite_id'); + +select has_column('campsite_carousel_i18n', 'media_id'); +select col_type_is('campsite_carousel_i18n', 'media_id', 'integer'); +select col_not_null('campsite_carousel_i18n', 'media_id'); +select col_hasnt_default('campsite_carousel_i18n', 'media_id'); + +select has_column('campsite_carousel_i18n', 'lang_tag'); +select col_is_fk('campsite_carousel_i18n', 'lang_tag'); +select fk_ok('campsite_carousel_i18n', 'lang_tag', 'language', 'lang_tag'); +select col_type_is('campsite_carousel_i18n', 'lang_tag', 'text'); +select col_not_null('campsite_carousel_i18n', 'lang_tag'); +select col_hasnt_default('campsite_carousel_i18n', 'lang_tag'); + +select has_column('campsite_carousel_i18n', 'caption'); +select col_type_is('campsite_carousel_i18n', 'caption', 'text'); +select col_is_null('campsite_carousel_i18n', 'caption'); +select col_hasnt_default('campsite_carousel_i18n', 'caption'); + + +select * +from finish(); + +rollback; + diff --git a/test/campsite_feature.sql b/test/campsite_feature.sql new file mode 100644 index 0000000..0395330 --- /dev/null +++ b/test/campsite_feature.sql @@ -0,0 +1,216 @@ +-- Test campsite_feature +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(46); + +set search_path to camper, public; + +select has_table('campsite_feature'); +select has_pk('campsite_feature'); +select table_privs_are('campsite_feature', 'guest', array['SELECT']); +select table_privs_are('campsite_feature', 'employee', array['SELECT']); +select table_privs_are('campsite_feature', 'admin', array['SELECT', 'INSERT', 'UPDATE', 'DELETE']); +select table_privs_are('campsite_feature', 'authenticator', array[]::text[]); + +select has_column('campsite_feature', 'campsite_feature_id'); +select col_is_pk('campsite_feature', 'campsite_feature_id'); +select col_type_is('campsite_feature', 'campsite_feature_id', 'integer'); +select col_not_null('campsite_feature', 'campsite_feature_id'); +select col_hasnt_default('campsite_feature', 'campsite_feature_id'); + +select has_column('campsite_feature', 'campsite_id'); +select col_is_fk('campsite_feature', 'campsite_id'); +select fk_ok('campsite_feature', 'campsite_id', 'campsite', 'campsite_id'); +select col_type_is('campsite_feature', 'campsite_id', 'integer'); +select col_not_null('campsite_feature', 'campsite_id'); +select col_hasnt_default('campsite_feature', 'campsite_id'); + +select has_column('campsite_feature', 'icon_name'); +select col_is_fk('campsite_feature', 'icon_name'); +select fk_ok('campsite_feature', 'icon_name', 'icon', 'icon_name'); +select col_type_is('campsite_feature', 'icon_name', 'text'); +select col_not_null('campsite_feature', 'icon_name'); +select col_hasnt_default('campsite_feature', 'icon_name'); + +select has_column('campsite_feature', 'name'); +select col_type_is('campsite_feature', 'name', 'text'); +select col_not_null('campsite_feature', 'name'); +select col_hasnt_default('campsite_feature', 'name'); + +select has_column('campsite_feature', 'position'); +select col_type_is('campsite_feature', 'position', 'integer'); +select col_not_null('campsite_feature', 'position'); +select col_has_default('campsite_feature', 'position'); +select col_default_is('campsite_feature', 'position', '2147483647'); + + +set client_min_messages to warning; +truncate campsite_feature cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company_host cascade; +truncate company_user cascade; +truncate company cascade; +truncate auth."user" cascade; +reset client_min_messages; + +insert into auth."user" (user_id, email, name, password, cookie, cookie_expires_at) +values (1, 'demo@tandem.blog', 'Demo', 'test', '44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e', current_timestamp + interval '1 month') + , (5, 'admin@tandem.blog', 'Demo', 'test', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') +; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', '', 60, 'FR', 'USD', 'ca') +; + +insert into company_user (company_id, user_id, role) +values (2, 1, 'admin') + , (4, 5, 'admin') +; + +insert into company_host (company_id, host) +values (2, 'co2') + , (4, 'co4') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (6, 2, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (8, 4, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, name, media_id, dogs_allowed, max_campers) +values (16, 2, 'Wooden lodge', 6, false, 7) + , (18, 4, 'Bungalow', 8, false, 6) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (26, 2, 'W1', 16) + , (28, 4, 'B1', 18) +; + +insert into campsite_feature (campsite_id, icon_name, name) +values (26, 'information', 'Feature 26.1') + , (28, 'wifi', 'Feature 28.1') +; + +prepare campsite_feature_data as +select campsite_id, name +from campsite_feature +; + +set role guest; +select bag_eq( + 'campsite_feature_data', + $$ values (26, 'Feature 26.1') + , (28, 'Feature 28.1') + $$, + 'Everyone should be able to list all campsite features across all companies' +); +reset role; + +select set_cookie('44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog', 'co2'); + +select lives_ok( + $$ insert into campsite_feature(campsite_id, icon_name, name) values (26, 'castle', 'Feature 26.2') $$, + 'Admin from company 2 should be able to insert a new campsite feature to that company.' +); + +select bag_eq( + 'campsite_feature_data', + $$ values (26, 'Feature 26.1') + , (26, 'Feature 26.2') + , (28, 'Feature 28.1') + $$, + 'The new row should have been added' +); + +select lives_ok( + $$ update campsite_feature set name = 'Feature 26-2' where campsite_id = 26 and name = 'Feature 26.2' $$, + 'Admin from company 2 should be able to update campsite feature of that company.' +); + +select bag_eq( + 'campsite_feature_data', + $$ values (26, 'Feature 26.1') + , (26, 'Feature 26-2') + , (28, 'Feature 28.1') + $$, + 'The row should have been updated.' +); + +select lives_ok( + $$ delete from campsite_feature where campsite_id = 26 and name = 'Feature 26-2' $$, + 'Admin from company 2 should be able to delete campsite feature from that company.' +); + +select bag_eq( + 'campsite_feature_data', + $$ values (26, 'Feature 26.1') + , (28, 'Feature 28.1') + $$, + 'The row should have been deleted.' +); + +select throws_ok( + $$ insert into campsite_feature (campsite_id, icon_name, name) values (28, 'toilet', 'Feature 28.2') $$, + '42501', 'new row violates row-level security policy for table "campsite_feature"', + 'Admin from company 2 should NOT be able to insert new campsite features to company 4.' +); + +select lives_ok( + $$ update campsite_feature set name = 'Feature 28-1' where campsite_id = 28 $$, + 'Admin from company 2 should not be able to update campsites of company 4, but no error if campsite_id is not changed.' +); + +select bag_eq( + 'campsite_feature_data', + $$ values (26, 'Feature 26.1') + , (28, 'Feature 28.1') + $$, + 'No row should have been changed.' +); + +select throws_ok( + $$ update campsite_feature set campsite_id = 28 where campsite_id = 26 $$, + '42501', 'new row violates row-level security policy for table "campsite_feature"', + 'Admin from company 2 should NOT be able to move campsite feature to one of company 4' +); + +select lives_ok( + $$ delete from campsite_feature where campsite_id = 28 $$, + 'Admin from company 2 should NOT be able to delete campsite from company 4, but not error is thrown' +); + +select bag_eq( + 'campsite_feature_data', + $$ values (26, 'Feature 26.1') + , (28, 'Feature 28.1') + $$, + 'No row should have been changed' +); + +select throws_ok( + $$ insert into campsite_feature (campsite_id, icon_name, name) values (26, 'baby', ' ') $$, + '23514', 'new row for relation "campsite_feature" violates check constraint "name_not_empty"', + 'Should not be able to insert campsite features with a blank name.' +); + +reset role; + + +select * +from finish(); + +rollback; + diff --git a/test/campsite_feature_i18n.sql b/test/campsite_feature_i18n.sql new file mode 100644 index 0000000..53621d2 --- /dev/null +++ b/test/campsite_feature_i18n.sql @@ -0,0 +1,44 @@ +-- Test campsite_feature_i18n +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(23); + +set search_path to camper, public; + +select has_table('campsite_feature_i18n'); +select has_pk('campsite_feature_i18n'); +select col_is_pk('campsite_feature_i18n', array['campsite_feature_id', 'lang_tag']); +select table_privs_are('campsite_feature_i18n', 'guest', array['SELECT']); +select table_privs_are('campsite_feature_i18n', 'employee', array['SELECT']); +select table_privs_are('campsite_feature_i18n', 'admin', array['SELECT', 'INSERT', 'UPDATE', 'DELETE']); +select table_privs_are('campsite_feature_i18n', 'authenticator', array[]::text[]); + +select has_column('campsite_feature_i18n', 'campsite_feature_id'); +select col_is_fk('campsite_feature_i18n', 'campsite_feature_id'); +select fk_ok('campsite_feature_i18n', 'campsite_feature_id', 'campsite_feature', 'campsite_feature_id'); +select col_type_is('campsite_feature_i18n', 'campsite_feature_id', 'integer'); +select col_not_null('campsite_feature_i18n', 'campsite_feature_id'); +select col_hasnt_default('campsite_feature_i18n', 'campsite_feature_id'); + +select has_column('campsite_feature_i18n', 'lang_tag'); +select col_is_fk('campsite_feature_i18n', 'lang_tag'); +select fk_ok('campsite_feature_i18n', 'lang_tag', 'language', 'lang_tag'); +select col_type_is('campsite_feature_i18n', 'lang_tag', 'text'); +select col_not_null('campsite_feature_i18n', 'lang_tag'); +select col_hasnt_default('campsite_feature_i18n', 'lang_tag'); + +select has_column('campsite_feature_i18n', 'name'); +select col_type_is('campsite_feature_i18n', 'name', 'text'); +select col_is_null('campsite_feature_i18n', 'name'); +select col_hasnt_default('campsite_feature_i18n', 'name'); + + +select * +from finish(); + +rollback; + diff --git a/test/campsite_i18n.sql b/test/campsite_i18n.sql new file mode 100644 index 0000000..c98dd45 --- /dev/null +++ b/test/campsite_i18n.sql @@ -0,0 +1,49 @@ +-- Test campsite_i18n +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(27); + +set search_path to camper, public; + +select has_table('campsite_i18n'); +select has_pk('campsite_i18n'); +select col_is_pk('campsite_i18n', array['campsite_id', 'lang_tag']); +select table_privs_are('campsite_i18n', 'guest', array['SELECT']); +select table_privs_are('campsite_i18n', 'employee', array['SELECT']); +select table_privs_are('campsite_i18n', 'admin', array['SELECT', 'INSERT', 'UPDATE', 'DELETE']); +select table_privs_are('campsite_i18n', 'authenticator', array[]::text[]); + +select has_column('campsite_i18n', 'campsite_id'); +select col_is_fk('campsite_i18n', 'campsite_id'); +select fk_ok('campsite_i18n', 'campsite_id', 'campsite', 'campsite_id'); +select col_type_is('campsite_i18n', 'campsite_id', 'integer'); +select col_not_null('campsite_i18n', 'campsite_id'); +select col_hasnt_default('campsite_i18n', 'campsite_id'); + +select has_column('campsite_i18n', 'lang_tag'); +select col_is_fk('campsite_i18n', 'lang_tag'); +select fk_ok('campsite_i18n', 'lang_tag', 'language', 'lang_tag'); +select col_type_is('campsite_i18n', 'lang_tag', 'text'); +select col_not_null('campsite_i18n', 'lang_tag'); +select col_hasnt_default('campsite_i18n', 'lang_tag'); + +select has_column('campsite_i18n', 'info1'); +select col_type_is('campsite_i18n', 'info1', 'xml'); +select col_is_null('campsite_i18n', 'info1'); +select col_hasnt_default('campsite_i18n', 'info1'); + +select has_column('campsite_i18n', 'info2'); +select col_type_is('campsite_i18n', 'info2', 'xml'); +select col_is_null('campsite_i18n', 'info2'); +select col_hasnt_default('campsite_i18n', 'info2'); + + +select * +from finish(); + +rollback; + diff --git a/test/edit_campsite.sql b/test/edit_campsite.sql index b8191c6..e9d774b 100644 --- a/test/edit_campsite.sql +++ b/test/edit_campsite.sql @@ -9,15 +9,15 @@ set search_path to camper, public; select plan(12); -select has_function('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean']); -select function_lang_is('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'sql'); -select function_returns('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'integer'); -select isnt_definer('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean']); -select volatility_is('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'volatile'); -select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'guest', array[]::text[]); -select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'employee', array[]::text[]); -select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'admin', array['EXECUTE']); -select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'boolean'], 'authenticator', array[]::text[]); +select has_function('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean']); +select function_lang_is('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'sql'); +select function_returns('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'integer'); +select isnt_definer('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean']); +select volatility_is('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'volatile'); +select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'guest', array[]::text[]); +select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'employee', array[]::text[]); +select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'edit_campsite', array ['integer', 'integer', 'text', 'text', 'text', 'boolean'], 'authenticator', array[]::text[]); set client_min_messages to warning; truncate campsite cascade; @@ -46,25 +46,25 @@ values (11, 1, 3, 'Type A', false, 5) , (13, 1, 3, 'Type C', false, 5) ; -insert into campsite (campsite_id, company_id, campsite_type_id, label, active) -values (21, 1, 11, 'A1', true) - , (22, 1, 12, 'B1', false) +insert into campsite (campsite_id, company_id, campsite_type_id, label, info1, info2, active) +values (21, 1, 11, 'A1', 'A1.1
', 'A1.2
', true) + , (22, 1, 12, 'B1', 'B1.1
', 'B1.2
', false) ; select lives_ok( - $$ select edit_campsite(21, 13, 'C1', false) $$, + $$ select edit_campsite(21, 13, 'C1', 'C1.1
', 'C1.2
', false) $$, 'Should be able to edit the first campsite.' ); select lives_ok( - $$ select edit_campsite(22, 12, 'B2', true) $$, + $$ select edit_campsite(22, 12, 'B2', 'B2.1
', 'B2.2
', true) $$, 'Should be able to edit the second campsite.' ); select bag_eq( - $$ select campsite_id, campsite_type_id, label, active from campsite $$, - $$ values (21, 13, 'C1', false) - , (22, 12, 'B2', true) + $$ select campsite_id, campsite_type_id, label, info1::text, info2::text, active from campsite $$, + $$ values (21, 13, 'C1', 'C1.1
', 'C1.2
', false) + , (22, 12, 'B2', 'B2.1
', 'B2.2
', true) $$, 'Should have updated all campsites.' ); diff --git a/test/edit_campsite_feature.sql b/test/edit_campsite_feature.sql new file mode 100644 index 0000000..838bf5a --- /dev/null +++ b/test/edit_campsite_feature.sql @@ -0,0 +1,80 @@ +-- Test edit_campsite_feature +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(12); + +set search_path to camper, public; + +select has_function('camper', 'edit_campsite_feature', array['integer', 'text', 'text']); +select function_lang_is('camper', 'edit_campsite_feature', array['integer', 'text', 'text'], 'sql'); +select function_returns('camper', 'edit_campsite_feature', array['integer', 'text', 'text'], 'integer'); +select isnt_definer('camper', 'edit_campsite_feature', array['integer', 'text', 'text']); +select volatility_is('camper', 'edit_campsite_feature', array['integer', 'text', 'text'], 'volatile'); +select function_privs_are('camper', 'edit_campsite_feature', array ['integer', 'text', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'edit_campsite_feature', array ['integer', 'text', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'edit_campsite_feature', array ['integer', 'text', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'edit_campsite_feature', array ['integer', 'text', 'text'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_feature cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (2, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, active, dogs_allowed, max_campers) +values (3, 1, 2, 'Type A', 'A
', true, false, 4) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (4, 1, 'A1', 3) +; + +insert into campsite_feature (campsite_feature_id, campsite_id, icon_name, name) +values (5, 4, 'information', 'Feature 1') + , (6, 4, 'wifi', 'Feature 2') +; + +select lives_ok( + $$ select edit_campsite_feature(5, 'toilet', 'Feature A') $$, + 'Should be able to edit the first feature' +); + +select lives_ok( + $$ select edit_campsite_feature(6, 'baby', 'Feature B') $$, + 'Should be able to edit the second feature' +); + +select bag_eq( + $$ select campsite_feature_id, campsite_id, icon_name, name from campsite_feature $$, + $$ values (5, 4, 'toilet', 'Feature A') + , (6, 4, 'baby', 'Feature B') + $$, + 'Should have updated all campsite type features.' +); + + +select * +from finish(); + +rollback; diff --git a/test/order_campsite_carousel.sql b/test/order_campsite_carousel.sql new file mode 100644 index 0000000..1bfff74 --- /dev/null +++ b/test/order_campsite_carousel.sql @@ -0,0 +1,107 @@ +-- Test order_campsite_carousel +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(11); + +set search_path to camper, public; + +select has_function('camper', 'order_campsite_carousel', array['text', 'integer', 'integer[]']); +select function_lang_is('camper', 'order_campsite_carousel', array['text', 'integer', 'integer[]'], 'sql'); +select function_returns('camper', 'order_campsite_carousel', array['text', 'integer', 'integer[]'], 'void'); +select isnt_definer('camper', 'order_campsite_carousel', array['text', 'integer', 'integer[]']); +select volatility_is('camper', 'order_campsite_carousel', array['text', 'integer', 'integer[]'], 'volatile'); +select function_privs_are('camper', 'order_campsite_carousel', array ['text', 'integer', 'integer[]'], 'guest', array[]::text[]); +select function_privs_are('camper', 'order_campsite_carousel', array ['text', 'integer', 'integer[]'], 'employee', array[]::text[]); +select function_privs_are('camper', 'order_campsite_carousel', array ['text', 'integer', 'integer[]'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'order_campsite_carousel', array ['text', 'integer', 'integer[]'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_carousel cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') + , ('text/plain', 'hello, world!') + , ('image/svg+xml', '') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values ( 3, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , ( 4, 1, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) + , ( 5, 1, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffff00","a"};')) + , ( 6, 1, 'text.txt', sha256('hello, world!')) + , ( 7, 1, 'image.svg', sha256('')) + , ( 8, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , ( 9, 1, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) + , (10, 1, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffff00","a"};')) + , (11, 1, 'text.txt', sha256('hello, world!')) + , (12, 1, 'image.svg', sha256('')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, max_campers, dogs_allowed, active) +values (13, 1, 3, 'Type A', 'A
', 5, false, true) + , (14, 2, 8, 'Type B', 'B
', 4, true, false) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (15, 1, 'A1', 13) + , (16, 2, 'A1', 14) +; + +insert into campsite_carousel (campsite_id, media_id, caption) +values (15, 3, '1') + , (15, 4, '2') + , (15, 5, '3') + , (15, 6, '4') + , (15, 7, '5') + , (16, 8, '1') + , (16, 9, '2') + , (16, 10, '3') + , (16, 11, '4') + , (16, 12, '5') +; + +select lives_ok( + $$ select order_campsite_carousel('A1', 1, '{5,7,6,3,4}') $$, + 'Should be able to sort campsite type slides using their media ID' +); + +select bag_eq( + $$ select campsite_id, media_id, position from campsite_carousel $$, + $$ values (15, 5, 1) + , (15, 7, 2) + , (15, 6, 3) + , (15, 3, 4) + , (15, 4, 5) + , (16, 8, 2147483647) + , (16, 9, 2147483647) + , (16, 10, 2147483647) + , (16, 11, 2147483647) + , (16, 12, 2147483647) + $$, + 'Should have sorted all campsite type slides.' +); + + +select * +from finish(); + +rollback; diff --git a/test/order_campsite_features.sql b/test/order_campsite_features.sql new file mode 100644 index 0000000..9ad0d3a --- /dev/null +++ b/test/order_campsite_features.sql @@ -0,0 +1,82 @@ +-- Test order_campsite_features +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(11); + +set search_path to camper, public; + +select has_function('camper', 'order_campsite_features', array['integer[]']); +select function_lang_is('camper', 'order_campsite_features', array['integer[]'], 'sql'); +select function_returns('camper', 'order_campsite_features', array['integer[]'], 'void'); +select isnt_definer('camper', 'order_campsite_features', array['integer[]']); +select volatility_is('camper', 'order_campsite_features', array['integer[]'], 'volatile'); +select function_privs_are('camper', 'order_campsite_features', array ['integer[]'], 'guest', array[]::text[]); +select function_privs_are('camper', 'order_campsite_features', array ['integer[]'], 'employee', array[]::text[]); +select function_privs_are('camper', 'order_campsite_features', array ['integer[]'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'order_campsite_features', array ['integer[]'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_feature cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (6, 2, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, name, media_id, dogs_allowed, max_campers) +values (16, 2, 'Wooden lodge', 6, false, 7) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (17, 2, 'A1', 16) +; + +insert into campsite_feature (campsite_feature_id, campsite_id, icon_name, name) +values (21, 17, 'information', '1') + , (22, 17, 'ball', '2') + , (23, 17, 'bicycle', '3') + , (24, 17, 'campfire', '4') + , (25, 17, 'castle', '5') +; + + +select lives_ok( + $$ select order_campsite_features('{23,25,24,21,22}') $$, + 'Should be able to sort campsite type features using their ID' +); + +select bag_eq( + $$ select campsite_feature_id, position from campsite_feature $$, + $$ values (23, 1) + , (25, 2) + , (24, 3) + , (21, 4) + , (22, 5) + $$, + 'Should have sorted all campsite type features.' +); + + +select * +from finish(); + +rollback; diff --git a/test/remove_campsite_carousel_slide.sql b/test/remove_campsite_carousel_slide.sql new file mode 100644 index 0000000..8946f47 --- /dev/null +++ b/test/remove_campsite_carousel_slide.sql @@ -0,0 +1,114 @@ +-- Test remove_campsite_carousel_slide +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(13); + +set search_path to camper, public; + +select has_function('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer']); +select function_lang_is('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'plpgsql'); +select function_returns('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'void'); +select isnt_definer('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer']); +select volatility_is('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'volatile'); +select function_privs_are('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'guest', array[]::text[]); +select function_privs_are('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'employee', array[]::text[]); +select function_privs_are('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'remove_campsite_carousel_slide', array['integer', 'text', 'integer'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_carousel_i18n cascade; +truncate campsite_carousel cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') + , ('text/plain', 'hello, world!') + , ('image/svg+xml', '') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (3, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (4, 1, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) + , (5, 2, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffff00","a"};')) + , (6, 2, 'text.txt', sha256('hello, world!')) + , (7, 2, 'image.svg', sha256('')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, max_campers, dogs_allowed, active) +values (10, 1, 3, 'Type A', 'A
', 5, false, true) + , (11, 2, 7, 'Type B', 'B
', 4, true, false) +; + +insert into campsite (campsite_id, label, company_id, campsite_type_id) +values (12, 'A1', 1, 10) + , (13, 'A1', 2, 11) +; + +insert into campsite_carousel (campsite_id, media_id, caption) +values (12, 3, 'Source caption') + , (12, 4, 'Source caption') + , (13, 5, 'Another caption') + , (13, 6, 'N/A') +; + +insert into campsite_carousel_i18n (campsite_id, media_id, lang_tag, caption) +values (12, 3, 'en', 'Target caption') + , (12, 3, 'es', 'Target caption (spanish)') + , (12, 4, 'en', 'Target caption') + , (12, 4, 'es', 'Target caption (spanish)') + , (13, 5, 'en', 'Target caption') + , (13, 5, 'es', 'Target caption (spanish)') + , (13, 6, 'en', 'Target caption') + , (13, 6, 'es', 'Target caption (spanish)') +; + +select lives_ok( + $$ select remove_campsite_carousel_slide(1, 'A1', 3) $$, + 'Should be able to delete a slide from the first campsite type' +); + +select lives_ok( + $$ select remove_campsite_carousel_slide(2, 'A1', 6) $$, + 'Should be able to delete a slide from the second campsite type' +); + +select bag_eq( + $$ select campsite_id, media_id, caption from campsite_carousel $$, + $$ values (12, 4, 'Source caption') + , (13, 5, 'Another caption') + $$, + 'Should have removed the slides' +); + +select bag_eq( + $$ select campsite_id, media_id, lang_tag, caption from campsite_carousel_i18n $$, + $$ values (12, 4, 'en', 'Target caption') + , (12, 4, 'es', 'Target caption (spanish)') + , (13, 5, 'en', 'Target caption') + , (13, 5, 'es', 'Target caption (spanish)') + $$, + 'Should have removed the slides’ translations' +); + + +select * +from finish(); + +rollback; diff --git a/test/remove_campsite_feature.sql b/test/remove_campsite_feature.sql new file mode 100644 index 0000000..77ff46c --- /dev/null +++ b/test/remove_campsite_feature.sql @@ -0,0 +1,109 @@ +-- Test remove_campsite_feature +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(13); + +set search_path to camper, public; + +select has_function('camper', 'remove_campsite_feature', array['integer']); +select function_lang_is('camper', 'remove_campsite_feature', array['integer'], 'sql'); +select function_returns('camper', 'remove_campsite_feature', array['integer'], 'void'); +select isnt_definer('camper', 'remove_campsite_feature', array['integer']); +select volatility_is('camper', 'remove_campsite_feature', array['integer'], 'volatile'); +select function_privs_are('camper', 'remove_campsite_feature', array['integer'], 'guest', array[]::text[]); +select function_privs_are('camper', 'remove_campsite_feature', array['integer'], 'employee', array[]::text[]); +select function_privs_are('camper', 'remove_campsite_feature', array['integer'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'remove_campsite_feature', array['integer'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_feature_i18n cascade; +truncate campsite_feature cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') + , ('text/plain', 'hello, world!') + , ('image/svg+xml', '') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (2, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (3, 1, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, slug, media_id, name, description, max_campers, dogs_allowed, active) +values (10, 1, '87452b88-b48f-48d3-bb6c-0296de64164e', 2, 'Type A', 'A
', 5, false, true) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (11, 1, 'A1', 10) + , (12, 1, 'A2', 10) +; + +insert into campsite_feature (campsite_feature_id, campsite_id, icon_name, name) +values (13, 11, 'wifi', 'Feature 1') + , (14, 11, 'baby', 'Feature 2') + , (15, 12, 'castle', 'Feature 3') + , (16, 12, 'ecofriendly', 'Feature 4') +; + +insert into campsite_feature_i18n (campsite_feature_id, lang_tag, name) +values (13, 'ca', 'Característica 1') + , (13, 'es', 'ES 1') + , (14, 'ca', 'Característica 2') + , (14, 'es', 'ES 2') + , (15, 'ca', 'Característica 3') + , (15, 'es', 'ES 3') + , (16, 'ca', 'Característica 4') + , (16, 'es', 'ES 4') +; + +select lives_ok( + $$ select remove_campsite_feature(13) $$, + 'Should be able to delete a feature from the first campsite' +); + +select lives_ok( + $$ select remove_campsite_feature(16) $$, + 'Should be able to delete a feature from the second campsite' +); + +select bag_eq( + $$ select campsite_feature_id, name from campsite_feature $$, + $$ values (14, 'Feature 2') + , (15, 'Feature 3') + $$, + 'Should have removed the features' +); + +select bag_eq( + $$ select campsite_feature_id, lang_tag, name from campsite_feature_i18n $$, + $$ values (14, 'ca', 'Característica 2') + , (14, 'es', 'ES 2') + , (15, 'ca', 'Característica 3') + , (15, 'es', 'ES 3') + $$, + 'Should have removed the features’ translations' +); + + +select * +from finish(); + +rollback; diff --git a/test/translate_campsite.sql b/test/translate_campsite.sql new file mode 100644 index 0000000..214b3c9 --- /dev/null +++ b/test/translate_campsite.sql @@ -0,0 +1,92 @@ +-- Test translate_campsite +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(14); + +set search_path to camper, public; + +select has_function('camper', 'translate_campsite', array['integer', 'text', 'text', 'text']); +select function_lang_is('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'sql'); +select function_returns('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'void'); +select isnt_definer('camper', 'translate_campsite', array['integer', 'text', 'text', 'text']); +select volatility_is('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'volatile'); +select function_privs_are('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'translate_campsite', array['integer', 'text', 'text', 'text'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_i18n cascade; +truncate campsite cascade; +truncate campsite cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (3, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, dogs_allowed, max_campers) +values (11, 1, 3, 'Type A', false, 5) +; + +insert into campsite (campsite_id, company_id, campsite_type_id, label, info1, info2, active) +values (21, 1, 11, 'A1', 'Info 1
', 'Info 2
', true) + , (22, 1, 11, 'B1', 'Info 1
', 'Info 2
', true) +; + +insert into campsite_i18n (campsite_id, lang_tag, info1, info2) +values (22, 'ca', 'i1
', 'i2
') + , (22, 'en', 'i1
', 'i2
') +; + +select lives_ok( + $$ select translate_campsite(21, 'ca', 'Informació 1
', '') $$, + 'Should be able to translate the first type' +); + +select lives_ok( + $$ select translate_campsite(22, 'es', '', 'Información 2
') $$, + 'Should be able to translate the second type' +); + +select lives_ok( + $$ select translate_campsite(22, 'ca', 'Informació 1
', 'Informació 2
') $$, + 'Should be able to overwrite the catalan translation of the second type' +); + +select lives_ok( + $$ select translate_campsite(22, 'en', null, null) $$, + 'Should be able to overwrite the english translation of the second type with all empty values' +); + +select bag_eq( + $$ select campsite_id, lang_tag, info1::text, info2::text from campsite_i18n $$, + $$ values (21, 'ca', 'Informació 1
', null) + , (22, 'ca', 'Informació 1
', 'Informació 2
') + , (22, 'es', null, 'Información 2
') + , (22, 'en', null, null) + $$, + 'Should have added and updated all translations.' +); + +select * +from finish(); + +rollback; diff --git a/test/translate_campsite_carousel_slide.sql b/test/translate_campsite_carousel_slide.sql new file mode 100644 index 0000000..7879c97 --- /dev/null +++ b/test/translate_campsite_carousel_slide.sql @@ -0,0 +1,102 @@ +-- Test translate_campsite_carousel_slide +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(13); + +set search_path to camper, public; + +select has_function('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text']); +select function_lang_is('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'sql'); +select function_returns('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'void'); +select isnt_definer('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text']); +select volatility_is('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'volatile'); +select function_privs_are('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'translate_campsite_carousel_slide', array['integer', 'text', 'integer', 'text', 'text'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_carousel_i18n cascade; +truncate campsite_carousel cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') + , (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') + , ('text/plain', 'hello, world!') + , ('image/svg+xml', '') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (3, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (4, 1, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) + , (5, 1, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffff00","a"};')) + , (6, 1, 'text.txt', sha256('hello, world!')) + , (7, 2, 'image.svg', sha256('')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, max_campers, dogs_allowed, active) +values (10, 1, 3, 'Type A', 'A
', 5, false, true) + , (11, 2, 7, 'Type B', 'B
', 7, true, false) +; + +insert into campsite (campsite_id, label, company_id, campsite_type_id) +values (12, 'A1', 1, 10) + , (13, 'A1', 2, 11) +; + +insert into campsite_carousel (campsite_id, media_id, caption) +values (13, 7, 'Source caption') + , (12, 5, 'Another caption') + , (12, 6, 'N/A') +; + +insert into campsite_carousel_i18n (campsite_id, media_id, lang_tag, caption) +values (13, 7, 'en', 'Target caption') +; + +select lives_ok( + $$ select translate_campsite_carousel_slide(1, 'A1', 5, 'ca', 'Traducció') $$, + 'Should be able to translate a carousel slide' +); + +select lives_ok( + $$ select translate_campsite_carousel_slide(1, 'A1', 5, 'es', '') $$, + 'Should be able to “translate” a carousel slide to the empty string' +); + +select lives_ok( + $$ select translate_campsite_carousel_slide(2, 'A1', 7, 'en', 'Not anymore') $$, + 'Should be able to overwrite a slide’s translation' +); + +select bag_eq( + $$ select campsite_id, media_id, lang_tag, caption from campsite_carousel_i18n $$, + $$ values (12, 5, 'ca', 'Traducció') + , (12, 5, 'es', null) + , (13, 7, 'en', 'Not anymore') + $$, + 'Should have all three slides' +); + + +select * +from finish(); + +rollback; diff --git a/test/translate_campsite_feature.sql b/test/translate_campsite_feature.sql new file mode 100644 index 0000000..79beb11 --- /dev/null +++ b/test/translate_campsite_feature.sql @@ -0,0 +1,96 @@ +-- Test translate_campsite_feature +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(14); + +set search_path to camper, public; + +select has_function('camper', 'translate_campsite_feature', array['integer', 'text', 'text']); +select function_lang_is('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'sql'); +select function_returns('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'void'); +select isnt_definer('camper', 'translate_campsite_feature', array['integer', 'text', 'text']); +select volatility_is('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'volatile'); +select function_privs_are('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'translate_campsite_feature', array['integer', 'text', 'text'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_feature_i18n cascade; +truncate campsite_feature cascade; +truncate campsite cascade; +truncate campsite_type cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (2, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name, description, active, dogs_allowed, max_campers) +values (3, 1, 2, 'Type A', 'A
', true, false, 4) +; + +insert into campsite (campsite_id, company_id, label, campsite_type_id) +values (4, 1, 'A1', 3) +; + +insert into campsite_feature (campsite_feature_id, campsite_id, icon_name, name) +values (5, 4, 'toilet', 'Feature 1') + , (6, 4, 'toilet', 'Feature 2') +; + +insert into campsite_feature_i18n (campsite_feature_id, lang_tag, name) +values (6, 'ca', 'carácter2') +; + +select lives_ok( + $$ select translate_campsite_feature(5, 'ca', 'Carácter 1') $$, + 'Should be able to translate the first feature' +); + +select lives_ok( + $$ select translate_campsite_feature(6, 'es', 'Característica 2') $$, + 'Should be able to translate the second feature' +); + +select lives_ok( + $$ select translate_campsite_feature(6, 'en', '') $$, + 'Should be able to “translate” the second feature with an empty translation' +); + +select lives_ok( + $$ select translate_campsite_feature(6, 'ca', 'Carácter 2') $$, + 'Should be able to overwrite the catalan translation of the second feature' +); + +select bag_eq( + $$ select campsite_feature_id, lang_tag, name from campsite_feature_i18n $$, + $$ values (5, 'ca', 'Carácter 1') + , (6, 'ca', 'Carácter 2') + , (6, 'es', 'Característica 2') + , (6, 'en', null) + $$, + 'Should have added and updated all translations.' +); + + +select * +from finish(); + +rollback; diff --git a/verify/add_campsite.sql b/verify/add_campsite.sql index 11b04b2..4696d9b 100644 --- a/verify/add_campsite.sql +++ b/verify/add_campsite.sql @@ -2,6 +2,6 @@ begin; -select has_function_privilege('camper.add_campsite(integer, text)', 'execute'); +select has_function_privilege('camper.add_campsite(integer, text, text, text)', 'execute'); rollback; diff --git a/verify/add_campsite@v1.sql b/verify/add_campsite@v1.sql new file mode 100644 index 0000000..11b04b2 --- /dev/null +++ b/verify/add_campsite@v1.sql @@ -0,0 +1,7 @@ +-- Verify camper:add_campsite on pg + +begin; + +select has_function_privilege('camper.add_campsite(integer, text)', 'execute'); + +rollback; diff --git a/verify/add_campsite_carousel_slide.sql b/verify/add_campsite_carousel_slide.sql new file mode 100644 index 0000000..ef0820a --- /dev/null +++ b/verify/add_campsite_carousel_slide.sql @@ -0,0 +1,7 @@ +-- Verify camper:add_campsite_carousel_slide on pg + +begin; + +select has_function_privilege('camper.add_campsite_carousel_slide(integer, text, integer, text)', 'execute'); + +rollback; diff --git a/verify/add_campsite_feature.sql b/verify/add_campsite_feature.sql new file mode 100644 index 0000000..c8bc710 --- /dev/null +++ b/verify/add_campsite_feature.sql @@ -0,0 +1,7 @@ +-- Verify camper:add_campsite_feature on pg + +begin; + +select has_function_privilege('camper.add_campsite_feature(integer, text, text, text)', 'execute'); + +rollback; diff --git a/verify/campsite__info.sql b/verify/campsite__info.sql new file mode 100644 index 0000000..7fc2991 --- /dev/null +++ b/verify/campsite__info.sql @@ -0,0 +1,11 @@ +-- Verify camper:campsite__info on pg + +begin; + +select info1 + , info2 +from camper.campsite +where false +; + +rollback; diff --git a/verify/campsite_carousel.sql b/verify/campsite_carousel.sql new file mode 100644 index 0000000..fd02ccd --- /dev/null +++ b/verify/campsite_carousel.sql @@ -0,0 +1,18 @@ +-- Verify camper:campsite_carousel on pg + +begin; + +select campsite_id + , media_id + , caption + , position +from camper.campsite_carousel +where false; + +select 1 / count(*) from pg_class where oid = 'camper.campsite_carousel'::regclass and relrowsecurity; +select 1 / count(*) from pg_policy where polname = 'guest_ok' and polrelid = 'camper.campsite_carousel'::regclass; +select 1 / count(*) from pg_policy where polname = 'insert_to_company' and polrelid = 'camper.campsite_carousel'::regclass; +select 1 / count(*) from pg_policy where polname = 'update_company' and polrelid = 'camper.campsite_carousel'::regclass; +select 1 / count(*) from pg_policy where polname = 'delete_from_company' and polrelid = 'camper.campsite_carousel'::regclass; + +rollback; diff --git a/verify/campsite_carousel_i18n.sql b/verify/campsite_carousel_i18n.sql new file mode 100644 index 0000000..83df654 --- /dev/null +++ b/verify/campsite_carousel_i18n.sql @@ -0,0 +1,12 @@ +-- Verify camper:campsite_carousel_i18n on pg + +begin; + +select campsite_id + , media_id + , lang_tag + , caption +from camper.campsite_carousel_i18n +where false; + +rollback; diff --git a/verify/campsite_feature.sql b/verify/campsite_feature.sql new file mode 100644 index 0000000..ad4dd33 --- /dev/null +++ b/verify/campsite_feature.sql @@ -0,0 +1,19 @@ +-- Verify camper:campsite_feature on pg + +begin; + +select campsite_feature_id + , campsite_id + , icon_name + , name + , position +from camper.campsite_feature +where false; + +select 1 / count(*) from pg_class where oid = 'camper.campsite_feature'::regclass and relrowsecurity; +select 1 / count(*) from pg_policy where polname = 'guest_ok' and polrelid = 'camper.campsite_feature'::regclass; +select 1 / count(*) from pg_policy where polname = 'insert_to_company' and polrelid = 'camper.campsite_feature'::regclass; +select 1 / count(*) from pg_policy where polname = 'update_company' and polrelid = 'camper.campsite_feature'::regclass; +select 1 / count(*) from pg_policy where polname = 'delete_from_company' and polrelid = 'camper.campsite_feature'::regclass; + +rollback; diff --git a/verify/campsite_feature_i18n.sql b/verify/campsite_feature_i18n.sql new file mode 100644 index 0000000..5ab0ce3 --- /dev/null +++ b/verify/campsite_feature_i18n.sql @@ -0,0 +1,11 @@ +-- Verify camper:campsite_feature_i18n on pg + +begin; + +select campsite_feature_id + , lang_tag + , name +from camper.campsite_feature_i18n +where false; + +rollback; diff --git a/verify/campsite_i18n.sql b/verify/campsite_i18n.sql new file mode 100644 index 0000000..a03bde3 --- /dev/null +++ b/verify/campsite_i18n.sql @@ -0,0 +1,12 @@ +-- Verify camper:campsite_i18n on pg + +begin; + +select campsite_id + , lang_tag + , info1 + , info2 +from camper.campsite_i18n +where false; + +rollback; diff --git a/verify/edit_campsite.sql b/verify/edit_campsite.sql index 241e8e4..7d28d72 100644 --- a/verify/edit_campsite.sql +++ b/verify/edit_campsite.sql @@ -2,6 +2,6 @@ begin; -select has_function_privilege('camper.edit_campsite(integer, integer, text, boolean)', 'execute'); +select has_function_privilege('camper.edit_campsite(integer, integer, text, text, text, boolean)', 'execute'); rollback; diff --git a/verify/edit_campsite@v1.sql b/verify/edit_campsite@v1.sql new file mode 100644 index 0000000..241e8e4 --- /dev/null +++ b/verify/edit_campsite@v1.sql @@ -0,0 +1,7 @@ +-- Verify camper:edit_campsite on pg + +begin; + +select has_function_privilege('camper.edit_campsite(integer, integer, text, boolean)', 'execute'); + +rollback; diff --git a/verify/edit_campsite_feature.sql b/verify/edit_campsite_feature.sql new file mode 100644 index 0000000..1ff7115 --- /dev/null +++ b/verify/edit_campsite_feature.sql @@ -0,0 +1,7 @@ +-- Verify camper:edit_campsite_feature on pg + +begin; + +select has_function_privilege('camper.edit_campsite_feature(integer, text, text)', 'execute'); + +rollback; diff --git a/verify/order_campsite_carousel.sql b/verify/order_campsite_carousel.sql new file mode 100644 index 0000000..22363bc --- /dev/null +++ b/verify/order_campsite_carousel.sql @@ -0,0 +1,7 @@ +-- Verify camper:order_campsite_carousel on pg + +begin; + +select has_function_privilege('camper.order_campsite_carousel(text, integer, integer[])', 'execute'); + +rollback; diff --git a/verify/order_campsite_features.sql b/verify/order_campsite_features.sql new file mode 100644 index 0000000..e837902 --- /dev/null +++ b/verify/order_campsite_features.sql @@ -0,0 +1,7 @@ +-- Verify camper:order_campsite_features on pg + +begin; + +select has_function_privilege('camper.order_campsite_features(integer[])', 'execute'); + +rollback; diff --git a/verify/remove_campsite_carousel_slide.sql b/verify/remove_campsite_carousel_slide.sql new file mode 100644 index 0000000..f76737c --- /dev/null +++ b/verify/remove_campsite_carousel_slide.sql @@ -0,0 +1,7 @@ +-- Verify camper:remove_campsite_carousel_slide on pg + +begin; + +select has_function_privilege('camper.remove_campsite_carousel_slide(integer, text, integer)', 'execute'); + +rollback; diff --git a/verify/remove_campsite_feature.sql b/verify/remove_campsite_feature.sql new file mode 100644 index 0000000..55edaaf --- /dev/null +++ b/verify/remove_campsite_feature.sql @@ -0,0 +1,7 @@ +-- Verify camper:remove_campsite_feature on pg + +begin; + +select has_function_privilege('camper.remove_campsite_feature(integer)', 'execute'); + +rollback; diff --git a/verify/translate_campsite.sql b/verify/translate_campsite.sql new file mode 100644 index 0000000..a70f2bd --- /dev/null +++ b/verify/translate_campsite.sql @@ -0,0 +1,7 @@ +-- Verify camper:translate_campsite on pg + +begin; + +select has_function_privilege('camper.translate_campsite(integer, text, text, text)', 'execute'); + +rollback; diff --git a/verify/translate_campsite_carousel_slide.sql b/verify/translate_campsite_carousel_slide.sql new file mode 100644 index 0000000..b3bf8dd --- /dev/null +++ b/verify/translate_campsite_carousel_slide.sql @@ -0,0 +1,7 @@ +-- Verify camper:translate_campsite_carousel_slide on pg + +begin; + +select has_function_privilege('camper.translate_campsite_carousel_slide(integer, text, integer, text, text)', 'execute'); + +rollback; diff --git a/verify/translate_campsite_feature.sql b/verify/translate_campsite_feature.sql new file mode 100644 index 0000000..32fec5a --- /dev/null +++ b/verify/translate_campsite_feature.sql @@ -0,0 +1,7 @@ +-- Verify camper:translate_campsite_feature on pg + +begin; + +select has_function_privilege('camper.translate_campsite_feature(integer, text, text)', 'execute'); + +rollback; diff --git a/web/static/camper.css b/web/static/camper.css index 17f3925..6bce16f 100644 --- a/web/static/camper.css +++ b/web/static/camper.css @@ -398,7 +398,7 @@ label, legend { font-style: italic; } -fieldset + label, fieldset + fieldset, label + label:not([x-show]) { +fieldset + label, fieldset + fieldset, label + label:not([x-show]), label + fieldset { margin-top: 1rem; } diff --git a/web/static/map.js b/web/static/map.js index 7b414df..53a00d4 100644 --- a/web/static/map.js +++ b/web/static/map.js @@ -76,16 +76,13 @@ }); } - function zoomToAccommodation(e) { - map.fitBounds(e.target.getBounds()); - } - // XXX: this is from the “parceles” layer. const ctm = [1, 0, 0, 1, 83.2784, 66.1766]; const transform = function (x, y) { return [ctm[0] * x + ctm[2] * y + ctm[4], ctm[1] * x + ctm[3] * y + ctm[5]]; } + const language = document.documentElement.getAttribute('lang'); const prefix = 'cp_'; for (const campsite of Array.from(container.querySelectorAll(`[id^="${prefix}"]`))) { const label = campsite.id.substring(prefix.length); @@ -126,7 +123,9 @@ accommodation.on({ mouseover: highlightAccommodation, mouseout: resetHighlight, - click: zoomToAccommodation, + click: function () { + window.location = `/${language}/campsites/${label}`; + }, }) } })(); diff --git a/web/static/public.css b/web/static/public.css index 9b7dc2b..8b4afb0 100644 --- a/web/static/public.css +++ b/web/static/public.css @@ -283,7 +283,7 @@ h1 a .name { left: -9999em; } -nav ul, .campsite_type_features ul, .outside_activities > ul { +nav ul, .campsite_type_features ul, .campsite_features ul, .outside_activities > ul { list-style: none; padding-left: 0; display: flex; @@ -347,7 +347,7 @@ nav:last-of-type > ul > li:last-child { .boto-reserva { border: 2px solid; border-radius: .6rem; - height: 40px; + height: 4rem; display: flex; align-items: center; margin-bottom: 3px; @@ -505,7 +505,7 @@ nav:last-of-type > ul > li:last-child { } } -dl, .nature > div, .outside_activities > div { +dl, .nature > div, .outside_activities > div, .campsite_info { display: flex; gap: 5rem; } @@ -545,8 +545,8 @@ dl, .nature > div, .outside_activities > div { background-color: var(--accent); } -.campsite_services { - margin: 0 0 40px 0; +.campsite_services, .campsite.carousel { + margin: 0 0 4rem 0; } .carousel { @@ -907,13 +907,16 @@ dt { flex: 1; } -.campsite_type_features li { - flex: 1; - font-size: 2.4rem; +.campsite_type_features li, .campsite_features li { text-align: center; justify-content: space-between; background-repeat: no-repeat; background-position: top center; +} + +.campsite_type_features li { + flex: 1; + font-size: 2.4rem; background-size: 7.2rem 7.2rem; padding-top: 7.2rem; } @@ -1055,6 +1058,28 @@ dt { height: .8rem; } +.campsite_info > * { + flex: 1; +} + +.campsite_features { + display: flex; + justify-content: center; + align-items: center; +} + +.campsite_features ul { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-auto-rows: 1fr; + gap: 5rem; +} + +.campsite_features li { + background-size: 3.6rem 3.6rem; + padding-top: 3.6rem; +} + .checkin-checkout { flex-direction: column; gap: 0; @@ -1289,7 +1314,7 @@ input[type="checkbox"]:focus { body > footer section { width: 100% !important; - margin: 40px 0 0 0; + margin: 4rem 0 0 0; } } diff --git a/web/templates/admin/campsite/carousel/form.gohtml b/web/templates/admin/campsite/carousel/form.gohtml index 11ac15f..7afcfe1 100644 --- a/web/templates/admin/campsite/carousel/form.gohtml +++ b/web/templates/admin/campsite/carousel/form.gohtml @@ -3,37 +3,28 @@ SPDX-License-Identifier: AGPL-3.0-only --> {{ define "title" -}} - {{- /*gotype: dev.tandem.ws/tandem/camper/pkg/campsite/types.slideForm*/ -}} - {{ if .MediaID }} - {{( pgettext "Edit Campsite Type Carousel Slide" "title" )}} - {{ else }} - {{( pgettext "New Campsite Type Carousel Slide" "title" )}} - {{ end }} + {{- /*gotype: dev.tandem.ws/tandem/camper/pkg/campsite.slideForm*/ -}} + {{- if .MediaID -}} + {{( pgettext "Edit Campsite Carousel Slide" "title" )}} + {{- else -}} + {{( pgettext "New Campsite Carousel Slide" "title" )}} + {{- end -}} {{- end }} {{ define "breadcrumb" -}} {{- /*gotype: dev.tandem.ws/tandem/camper/pkg/campsite/types.slideForm*/ -}}