Planet Drupal

Subscribe to flux Planet Drupal
Drupal.org - aggregated feeds in category Planet Drupal
Mis à jour : il y a 48 min 48 sec

Jim Birch: Using Drupal's Environment Indicator to help visually manage Dev, Stage, and Production Servers

mer, 20/05/2015 - 11:00

There are days that I work on half a dozen different websites.  I'm sure some of you are in the same boat.  We make client edits and change requests with rapid effieciency.  We work locally, push to staging, test and review, then push to the live server and repeat.  I would be remiss in saying that I never made a change on the live or staging site accidentally.

The Drupal Environment Indicator module allows you to name, color, and configure a multitude of visual queues for each of your different servers, or other variables, like Git branch or path.  It is very easy to install, and can integrate with Toolbar, Admin Menu, and Mobile Friendly Navigation Toolbar for no additional screen space. 

Once installed, set the permissions of the roles you want to give permission to see the indicator.  You can adjust the general settings at /admin/config/development/environment-indicator/settings

While you can create different indicators inside the admin UI, I prefer to set these in the settings.php files on the various servers so they are not overidden when we move databases back from Production back to Staging and Dev.

Read more

Catégories: Elsewhere

Modules Unraveled: 135 Writing the Book Drupal 8 Configuration Management with Anja Schirwinski and Stefan Borchert - Modules Unraveled Podcast

mer, 20/05/2015 - 06:40
Published: Tue, 05/19/15Download this episodeWriting a Book for D8
  • What’s it like writing a book for a piece of software that isn’t even officially released yet?
  • How long did the writing process take?
    • Packt publishing sent us a proposal to write this book in December of 2013. We got started quickly, sending them an outline of the chapters and an estimated page count in the same month. The original estimated page count was 150, it turned out to be around 120. We received a pretty strict time line, having to finish a chapter every two weeks, starting in December of 2013.
    • We managed to finish most chapters in two weeks, but some of the longer ones took a little longer since we also started one of our biggest projects we had had until then, also in January. That was pretty tough because that project took up way more than a regular full time job, so we ended up having to write all of the chapters late at night and on the weekends. In May, all of our chapters then went to the editors and we didn’t hear back from the publisher for a really long time.
    • We also told them that we will have to rewrite a lot of the chapters since there was so much work in progress with the Configuration Management Initiative and they were changing a lot about how it worked, like going from the file based default to the database default. I think it was in January of 2015 when chapters came back with some feedback and we started rewriting every chapter, which was pretty painful at the time. We were able to update some of the documentation at drupal.org with the changes we found. It felt good to contribution at least a small part, when with our project and the book we had no time left to contribute code to Drupal 8 like we usually do.
    • We spent around 40 days on the book between the two of us.
    • In December, Packt asked the first publisher to review the book. We had recommended them one of our team members at undpaul, Tom, who has a similar amount of Drupal knowledge as Stefan. We really wanted to have someone from CMI to review the book, like Greg Dunlap. They had turned down reviewing the book after the first chapters were written, because too much would still change. Then after the changes went in we kept recommending Greg but I never heard anything back, maybe he was busy or they didn’t bother to ask. At the beginning of this year they told us the book was planned to be published by March. We recommended waiting because we didn’t expect a release candidate before the European Drupalcon and we would have rather had someone like Greg take the time to review, but Packt had another opinion :) Since most of CMI changes were finished, we didn’t feel too uncomfortable about the time of publishing, and it was also kind of nice to finally be done with this thing :) So it took a little over a year from start to finish. It was published on March 24th.
  • Do you expect to need to rewrite anything between now and when 8.0 is released?
The Book: Drupal 8 Configuration Management
  • What do you cover in the book?
    • We start of with a basic introduction to what Configuration Management in Drupal means, because it is a thing in Software development in general, that doesn’t usually refer to what it is in Drupal, where it basically just means that configuration is saved in files which makes deployment easier. In the first chapters, we make sure the reader understands what Configuration Management means and why version control is so important. We mention some best practices and then show how to use it for non-coders as well, since there’s a nice backend non-technical folks can use, even if you don’t use version control (which of course we don’t recommend). We also have a part that describes how managing configuration works in Drupal 7 (Features!) and then dive into code examples, explaining schema files, showing how to add configuration to a custom module, how to upgrade Drupal 7 variables to the new system and cover configuration management for multilingual sites.
  • Who is the target audience of the book?
  • Why did you decide to write about Configuration Management?
    • We have used Features to deploy configuration changes for a very long time, I don’t recall not using it since we started the company 5 years ago. We have talked about it at several DrupalCamps and Drupal User Groups and always tried to convince everyone to use it. We were really excited about the Configuration Management Initiative and thought it was a very good fit for us.
  • Before we started recording, you mentioned that there is a companion website to the book. Can you talk about what content we’ll find there, and what purpose that serves?
  • Are you building any sites in D8 at Undpaul?
Episode Links: Anja on drupal.orgAnja on TwitterStefan on drupal.orgStefan on TwitterWhere to buy the bookThe website for the bookundpaul on Twitterundpaul Instagramundpaul websiteTags: Drupal 8Bookplanet-drupal
Catégories: Elsewhere

Gizra.com: Visual regression tests on every commit

mar, 19/05/2015 - 23:00

As we dive deeper into visual regression testing in our development workflow we realize a sad truth: on average, we break our own CSS every week and a half.

Don't feel bad for us, as in fact I'd argue that it's pretty common across all web projects - they just don't know it. It seems we all need a system that will tell us when we break our CSS.

While we don't know of a single (good) system that does this, we were able to connect together a few (good) systems to get just that, with the help of: Travis-CI, webdriverCSS, Shoov.io, BrowserStack/Sauce Labs, and ngrok. Oh my!

Don't be alarmed by the long list. Each one of these does one thing very well, and combining them together was proven to be not too complicated, nor too costly.

You can jump right into the .travis file of the Gizra repo to see its configuration, or check the webdriverCSS test. Here's the high level overview of what we're doing:

Gizra.com is built on Jekyll but visual regression could be executed on every site, regardless of the underlying technology. Travis is there to help us build a local installation. Travis also allows adding encrypted keys, so even though the repo is public, we were able to add our Shoov.io and ngrok access tokens in a secure way.

We want to use services such as BrowserStack or Sauce-Labs to test our local installation on different browsers (e.g. latest chrome and IE11). For that we need to have an external URL accessible by the outside world, which is where ngrok comes in: ngrok http -log=stdout -subdomain=$TRAVIS_COMMIT 9000 from the .travis.yml file exposes our Jekyll site inside the Travis box to a unique temporary URL based on the Git commit (e.g. https://someCommitHash.ngrok.io).

WebdriverCSS tests are responsible for capturing the screenshots, and comparing them against the baseline images. If a regression is found, it will be automatically pushed to Shoov, and a link to the regression would be provided in the Travis log. This means that if a test was broken, we can immediately see where's the regression and figure out if it is indeed a bug - or, if not, replace the baseline image with the "regression" image.

Visual regression found and uploaded to shoov.io

Continue reading…

Catégories: Elsewhere

Mediacurrent: Contrib Committee Status Review for April, 2015

mar, 19/05/2015 - 22:47

The fourth month of the year brought reminders that Winter can show up at unexpected times, with snow flurries during the early parts of the month. It also that we can only juggle so much. With many of us involved in organizing regional events and preparing for Drupalcon, our code contributions waned for a second month, down to a rather low 20 hours.

Catégories: Elsewhere

Drupalpress, Drupal in the Health Sciences Library at UVA: executing an r script with bash

mar, 19/05/2015 - 22:43

Here’s a tangent:

Let’s say you need to randomly generate a series of practice exam questions. You have a bunch of homework assignments, lab questions and midterms, all of which are numbered in a standard way so that you can sample from them.

Here’s a simple R script to run those samples and generate a practice exam that consists of references to the assignments and their original numbers.

## exam prep script ## build hw data j <- 1 hw <- data.frame(hw_set = NA, problm = seq(1:17)) for (i in seq(1:12)) { hw[j,1] <- paste0("hw",j) j <- j+1 } library(tidyr) hw <- expand(hw) names(hw) <- c("problm_set", "problm") ## build exam data j <- 1 exam <- data.frame(exam_num = NA, problm = seq(1:22)) for (i in seq(1:8)) { exam[j,1] <- paste0("exam",j) j <- j+1 } library(tidyr) exam <- expand(exam) names(exam) <- c("problm_set", "problm") ## create practice exam prctce <- rbind(exam,hw) prctce_test <- prctce[sample(1:nrow(prctce), size=22),] row.names(prctce_test) <- 1:nrow(prctce_test) print(prctce_test)

As the last line indicates, the final step of the script is to output a prctce_test … that will be randomly generated each time the script is run, but may include duplicates over time.

Sure. Fine. Whatever.

Probably a way to do this with Drupal … or with Excel … or with a pencil and paper … why use R?

Two reasons: 1) using R to learn R and 2) scripting this simulation let’s you automate things a little bit easier.

In particular, you can use something like BASH to execute the script n number of times.

for n in {1..10}; do Rscript examprep.R > "YOUR_PATH_HERE/practice${n}.txt"; done

That will give you 10 practice test txt files that are all named with a tokenized number, with just one command. And of course that could be written into a shell script that’s automated or processed on a scheduler.

Sure. Fine. Whatever.

OK. While this is indeed a fairly underwhelming example, the potential here is kind of interesting. Our next step is to investigate using Drupal Rules to initiate a BASH script that in turn executes an algorithm written in R. The plan is to also use Drupal as the UI for entering the data to be processed in the R script.

Will document that here if/when that project comes together.

Catégories: Elsewhere

Open Source Training: DrupalCon Los Angeles Review

mar, 19/05/2015 - 20:33

DrupalCon Los Angeles took place from May 11 to 15 and three of our team were there.

We were part of over 3100 who crowded into downtown L.A.

We'll recap our favorite sessions in other blog post, but here's are some thought on Drupal L.A. itself.

Catégories: Elsewhere

Drupal Watchdog: Web API Alphabet Soup

mar, 19/05/2015 - 17:56
Feature

Drupal 8 offers unprecedented support for creating RESTful APIs. This was one of the major goals of the Web Services and Context Core Initiative (WSCCI), and one we've delivered on pretty well. However, as with most things that are worth doing, just because Drupal core “supports” it doesn't mean you'll see good results without an understanding of what's going on. In this article, we'll explore some of these principles, so that when it comes time to design with those systems, you'll know how to think about the problem.

HAL

Drupal 8 ships with support for encoding and representing its entities (and other objects) via the Hypermedia Application Language (HAL) specification. HAL can currently be expressed in JSON or XML, and is a specification for describing resources. As the specification says, HAL is “a bit like HTML for machines.”

What that means is that a HAL API can provide enough data for a machine agent to visit the root ("/") of a website, then navigate its way through the remainder of the system exclusively by following the links provided in responses. Humans do the exact same thing by visiting a page and clicking on links. The notion that machines might also want to do this is a relatively obvious idea, but one that has, until recently, rarely been followed on the web.

Still, though, it's pretty abstract. To really understand why HAL is powerful – and what it does for us in Drupal – it's necessary to go back to the basic constraints and capabilities of the problem space it operates in: HTTP and REST. The crucial documents there are RFC2616 and Roy Fielding's thesis, both well-worth [re-]reading. But a more easily digestible version comes in the form of the Richardson Maturity Model, first laid out by Leonard Richardson in 2008, and since revisited by Martin Fowler and Steve Klabnik.

RMM

The Richardson Maturity Model helpfully suggests a set of four “maturity” levels into which HTTP APIs fall:

Catégories: Elsewhere

Cheeky Monkey Media: Building a custom module part 1

mar, 19/05/2015 - 16:00

This tutorial is written for new drupal developers or php developers who want to learn drupal.

We are going to cover the following in this tutorial:

  • Creating the file structure for the module.
  • Creating a simple table.
  • Register a path to display the custom form.
  • Create a custom form with 4 fields.
  • Capturing and saving the form values in the database.
  • Retrieving and re-populating the form with user's input.

Let's get started.

Step 1: File Structure

Create the structure for our first module. We are...

Catégories: Elsewhere

Drupal governance announcements: Now accepting nominations for the Aaron Winborn Award!

lun, 18/05/2015 - 23:28

As mentioned during Dries's DrupalCon LA keynote, the Drupal Community Working Group is now accepting nominations for the Aaron Winborn Award, to honour Drupal community members who demonstrate personal integrity, kindness, and above-and-beyond commitment to the Drupal community.

Nominations are open until Monday 15 June 2015, and the selected recipient will receive a scholarship and stipend to attend DrupalCon with recognition during a plenary session at the event.

Submit your nominations here: https://www.drupal.org/aaron-winborn-award

Catégories: Elsewhere

Acquia: How to Select Drupal Modules: Part 3 - Evaluation Tips

lun, 18/05/2015 - 22:26

In the previous posts we’ve focused on defining your requirements and the basics of searching for modules. Once you’ve found a Drupal project you’re interested in, now you can make a quick evaluation of the project to determine if you should dig deeper before you test it out.

Evaluation Criteria

Each module you select and install on your site must be maintained. There will be security updates, feature improvements and bug fixes offered on a rolling basis. The update manager within Drupal will notify you when new releases are available. This means you will never miss a key security release.

If a module is actively maintained it will mean that one aspect of your site is more likely to be secure and bug-free. One less thing to worry about! Take a “maintenance first” approach to module selection to limit potential issues arising from compatibility issues or security issues that might arise.

An initial evaluation is something an experienced Drupal developer might do in about one to two minutes, simply to compare two modules to decide which to download and try first. However, let’s tease this apart. There are three useful criteria for evaluating a module.

  1. Reputation: How many maintainers? What other contributions have the maintainers made? Is the individual or company a member of the Drupal Association?
  2. Reach: Is there a community around the module? Are there related modules which integrate with it? What is the total number of installations? Checking the usage over time is there a stable arc?
  3. Currency: Have there been recent commits? Are issues being added by users? Is the maintainer responding? Is there a stable (green/not alpha or beta) release available?

These criteria can give you some indication of the level of effort that is being invested in maintaining the software, and help you interpret information on the project page.

The Project Page

You can determine how a project scores against those criteria based on the information available on the project page itself. A wealth of information is available.

  1. Description: This should provide some basic information about the project and you should be able to tell what requirements the module has.
  2. Project information: Maintenance status and how many reported installations. Just because only two others use a project, doesn’t mean it’s not a good start for a solution for your team.
  3. Downloads: Is there a compatible version available? If it's not recently updated it might be a warning sign, or it might just be a stable, well-used module that just works.
  4. Maintainers: Is there an active team of maintainers? You can look at their profiles which also list other contributions and activities.
  5. What are current issues? The graphs indicate recent activity and also a brief analysis of how responsive the maintenance team is. Keep in mind most of this work is done on a voluntary basis, so if you’re willing to help out, you can often get a better response.
  6. Is documentation available? This will help you in the next step of testing and exploring the module.

The project information provided should be considered in relation to the other information. For example, you might see a project like Bean doesn’t have a Drupal 8 version. This might make you wonder if the solution is future-friendly. In this case, similar functionality has been incorporated into Drupal 8, so it actually makes this module unnecessary.

To give another example, a project with few installations could be just that unique solution you need to connect your Drupal site to an obscure third party application. And as another example, a project managed by a Drupal newcomer who has few contributions could be a great sign that someone is bringing in new skills and experience to the community.

I would never disparage or dismiss a project based on just one of the criteria. Make sure you look at each aspect of the project and balance it with the rest of the information available.

How can I help?

OK, now we’ve whittled down our choices and found a module or two we’d like to try out. In the next blog post, we’ll actually install and test out a module. After that, I’ll show you how to explore and “learn” a new module.

In our Drupal Site Building course we focus on the essential building blocks of Drupal and contributed modules. In fact, some of the contributed modules we use in the Drupal 7 course have become core in Drupal 8, which is a good sign that the community has convened around specific requirements and solutions.

If you’re stuck trying to find a module for X, please leave a comment and I’ll help you find the module you’re looking for.

Tags:  modules drupal 7 site building training learning functionality acquia drupal planet
Catégories: Elsewhere

Drupal for Government: Tracking Charlottesville City Expenses in the Crowd - Part 2 Charts!

lun, 18/05/2015 - 21:36

After part one aka "getting the data cleaned up and in there" it's time to do a few things to make the pretty pictures.  Using the charts tool is a pretty natural visual drill down tool, and its integration with highcharts means it can handle a ton of data. Attached below is a feature that includes all the content type, view, and feeds, I've also attached the original data in case there's someone out there interested in learning how our city blows its wad ;)

Catégories: Elsewhere

Drupal CMS Guides at Daymuse Studios: Drupal, Content Strategy, and the Prevailing Power of the Play Button

lun, 18/05/2015 - 21:36

Video is key to increasing user engagement. Learn how to integrate YouTube video with your content in Drupal using the Media and Media: YouTube modules.

Catégories: Elsewhere

Promet Source: DrupalCon LA Spotlight

lun, 18/05/2015 - 21:20

The Drupal community gathered in Tinseltown for the 2015 DrupalCon, and Promet Source was there to partake in the all the lights, camera and action.

Check out some of our photos from the event below!

 

Want to know more about what we were up to at this year's DrupalCon? Are you going to DrupalCon Barcelona later this year? Share your info with us below so you can hear about Promet's plan for the next spotlight event of the Drupal-verse.

Catégories: Elsewhere

Jim Birch: Learn by Listening, a Guide to Drupal Podcasts

lun, 18/05/2015 - 13:00

While I read a lot, as much as I can about Drupal and Web Development, I feel like I learn even more when I listen. So, while driving to work, or while working out on the treadmill, I listen as much as I can to the great folks below that dedicate their time every week to discussing, training, interviewing, and spreading their knowledge.

Acquia Podcasts

Acquia's Open Source Evangelist, Jeffrey "jam" McGuire, gives quick interviews of Drupal community members from conferences and events all around the world.  But looking deeper into Acquia's site, you may also stumble upon jam's Drupal Camp in which Mr. McGuire curates great sessions and presentations from previous camps and cons; Power of PHP which is a PHP focused, more technical collection of talks; and a podcast about Drupal 8.

Read more

Catégories: Elsewhere

Web Omelette: Adding new HTML tags in the <head> in Drupal 8

lun, 18/05/2015 - 09:05

In a previous article I've shown you how you can add new html elements to the <head> of your Drupal 7 site. Recently, however, I was working on a Drupal 8 project and encountered the need to do this in D8. And it took me a while to figure it out so I thought I'd share the process with you.

As you know, in Drupal 7 we use drupal_add_html_head() from anywhere in the code to add a rendered element into the <head>. This is done by passing a render array and most of the time you'll use the type #tag. In Drupal 8, however, we no longer have this procedural function so it can be a bit tricky to find out how this is done.

Although existing in Drupal 7 as well, the #attached key in render arrays really becomes important in D8. We can no longer add any scripts or stylesheets to any page without such proper attachment to render arrays. In my last article I've shown you how to add core scripts to pages in case they were missing (which can happen for anonymous users). In essence, it is all about libraries now that get attached to render arrays. So that is most of what you'll hear about.

But libraries are not the only thing you can attach to render arrays. You can also add elements to the head of the page in a similar way you'd attach libraries. So if we wanted to add a description meta tag to all of the pages on our site, we could implement hook_page_attachments() like so:

/** * Implements hook_page_attachments(). */ function module_name_page_attachments(array &$page) { $description = [ '#tag' => 'meta', '#attributes' => [ 'name' => 'description', 'content' => 'This is my website.', ], ]; $page['#attached']['html_head'][] = [$description, 'description']; }

In the example above we are just adding a dummy description meta tag to all the pages. You probably won't want to apply that to all the pages though and rather have the content of the description tag read the title of the current node. In this case you can implement hook_entity_view() like so:

/** * Implements hook_entity_view(). */ function demo_entity_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode, $langcode) { if ($entity->getEntityTypeId() !== 'node') { return; } $description = [ '#tag' => 'meta', '#attributes' => [ 'name' => 'description', 'content' => \Drupal\Component\Utility\SafeMarkup::checkPlain($entity->title->value), ], ]; $build['#attached']['html_head'][] = [$description, 'description']; }

Now you targeting the node entities and using their titles as the content for the description meta tag. And that is pretty much it.

Hope this helps.

In Drupal 8 var switchTo5x = true;stLight.options({"publisher":"dr-8de6c3c4-3462-9715-caaf-ce2c161a50c"});
Catégories: Elsewhere

Drupal core announcements: Drupal core security release window on Wednesday, May 20

lun, 18/05/2015 - 07:02
Start:  2015-05-20 (All day) America/New_York Online meeting (eg. IRC meeting) Organizers:  David_Rothstein

The monthly security release window for Drupal 6 and Drupal 7 core will take place on Wednesday, May 20.

This does not mean that a Drupal core security release will necessarily take place on that date for either the Drupal 6 or Drupal 7 branches, only that you should prepare to look out for one (and be ready to update your Drupal sites in the event that the Drupal security team decides to make a release).

There will be no bug fix/feature release on this date; the next window for a Drupal core bug fix/feature release is Wednesday, June 3.

For more information on Drupal core release windows, see the documentation on release timing and security releases, and the discussion that led to this policy being implemented.

Catégories: Elsewhere

Drupal for Government: From spreadsheet to citizen government with Drupal - Volume 1 - Feeds

lun, 18/05/2015 - 01:31

Thanks to the local Charlottesville GOP we have a FOIA'ed copy Charlottesville city hall expenses.  It's a small windows in to how our city staff spends money.  Without putting any value judgements on the numbers themselves, let's look at how to go from a spreadsheet to pretty charts and maps!  

Catégories: Elsewhere

Another Drop in the Drupal Sea: DrupalCon LA Saturday Recap

dim, 17/05/2015 - 23:18

I headed to the Saturday sprint after completing my workout, showering, eating breakfast and packing my bags. Eventually, there were probably at least 30 people at the sprint. I worked a bit more on a patch I submitted to the Flag module and eventually started working on testing the changes I pushed to OG Forum D7. Unfortunately, they changes appeared to be doing absolutely nothing. I didn't figure out what I was overlooking before I had to leave.

read more

Catégories: Elsewhere

Paul Johnson: Could VR tech make a child's dying wishes come true?

dim, 17/05/2015 - 17:11

For over a year I have had the honour of being responsible for delivering 2 new web platforms for Great Ormond Street Hospital for Children NHS Foundation Trust (GOSH), the hospital and charity websites. During that time I've witness and learnt so much about the exemplary way they care for children, their families from both a medical and pastoral perspective. The good news is that now, using open source content management system called Drupal, they are now in a position to have a web presence which adequatley supports and reflects their internationally celebrated work.

One of the inevitable aspects of treating children with the most severe illnesses is sadly not every child can be made better. It is a reality which has hit me hard the whole time I've worked for GOSH.

Whilst I was at DrupalCon Los Angeles I met Joe Caccavano, CMO at Phase2, who was showing me an curious device having 6 GoPro array of cameras strapped together into a single head. With it something remarkable is possible. Watching footage taken during the conference with the GoPros using a VR headset (just an android phone) allowed me to immerse myself into a virtual world - try it for yourself. For those of you who have tried this, perhaps you shared my pulse raising hair on the back of your neck standing up reaction. It literally felt like I was there, on the drone from which the footage had been shot.

That moment I had an epiphany. I thought about sick children, how film and TV personalities generously visit them or send video messages with well wishes. What if the GoPro camera array captured a child's idol speaking to the camera as if it were the child? Using the child's name, speaking to them (well the camera). Imagine how lifting that would be to a kid, who perhaps couldn't leave bed or due to infection risk couldn't have visitors. They could repeat the experience too. How amazing would that be? Not only this, busy stars could do shoots from anywhere in the world.

The great news is that thanks to Google the technology to watch these films is now so cheap anyone can afford it - £4.99! All that remains is for someone to try my idea out. I will certainly be letting GOSH know of the concept, perhaps you know of a children's hospital or hospice who could do the same.

If this idea has inspired you please share it on social media, with your help maybe the idea will reach someone who could make it happen.

Joe Caccavano, CMO at Phase2, with his 6 camera GoPro Array

VR tech is now in the realms of being affordable to many

Further information: Great Ormond Street Hospital for Children NHS Foundation TrustGreat Ormond Street Hospital CharityGoogle Cardboard's Cheap VR Can Work With iPhones TooAbout the Drupal project
Catégories: Elsewhere

DrupalCon News: Thanks for Drupaling!

dim, 17/05/2015 - 03:29

After a fantastic week, we are exhausted but so pumped about all of the awesome things that happened at DrupalCon Los Angeles.  We hope you had an amazing and enriching time and would love to hear your thoughts so we can make the upcoming Cons even better.  

Check out the DrupalCon Los Angeles Survey and say those words.

Catégories: Elsewhere

Pages