Envato Tuts+: Intro to Drupal: Build a Simple CMS

Planet Drupal - Wed, 2022-11-30 22:54

Drupal's popularity has lately been rising. It's a great platform for setting up content management systems and community driven sites. Here, I'll give a general overview of Drupal and build a simple site for a fake client. We'll begin with outlining the client's needs, installing and configuring a few modules, creating user roles and assigning permissions, and finally we'll add in some content. We won't go into theming, as it's a bit out of the scope of this article.

1. A fake client

Let's start off with a fake client.

SmartMarks is a small marketing consulting firm, with 4 employees. Each employee would like their own blog. The site will need a few pages in addition to the blogs:

  • Home
  • About
  • Contact
  • Links
  • Blogs

Shannon, the business owner, wants full control over the site. The rest of the employees (Bill, Jean, and Terry) should only be able to write blog entries, but Bill may publish links.

The contact us form will accept the user's name, phone, email, and a short message. Submissions of the contact form should be sent only to Shannon.

Sounds pretty simple, huh? Well with Drupal, a lot of this core functionality is already built in. We'll use as much of the core functionality as we can, and we'll add in a few other modules to make building this site a breeze!

2. Install some stuff

First, start out by installing Drupal. I'll be developing this one on my local machine, but you can install it anywhere you wish. For this tutorial, I'll be working with Drupal 6.x.

To install Drupal, simply download (https://drupal.org) and unpack it, create your database, and visit http://localhost/ (or your own dev URL). Installation should be relatively simple for ya.

You'll need to create a config file. You can copy /webroot/sites/default/default.settings.php to /webroot/sites/default/settings.php. Be sure to make it writable to the server. Also, leave a copy of sites/default/default.settings.php where it is; Drupal will use it during installation.

After your config file is created, you can go ahead and install Drupal.

On the next screen, you'll setup the first account for the site. This is the main administrator, or super user. This user will have permission to do anything and everything on the site.

And you can go ahead and specify a few server settings. If your server is configured for mod_rewrite URL rewriting, then you can go ahead and enable Clean URLs now. This will change your URLs from something like /?q=node/3 to just /node/3.

After successful installation, you can visit the site and login as the superuser.

3. Get some modules

For this site, we'll be using a few contributed modules. We'll have to download those and activate them before we can use them.

All modules that you'll install will be placed in the directory /webroot/sites/all/modules. If the modules directory doesn't exist there, just make a new one and name it modules.

Make sure to download the modules compatible with the version of Drupal that you're using. I'm using Drupal 6.x.

4. Admin Menu

This module is a must have for working with Drupal. It's not totally necessary, but it will save you loads of time.

Download it over at http://drupal.org/project/admin_menu and place it in /webroot/sites/all/modules

PathAuto & Token

Next, go grab a copy of PathAuto and Token. PathAuto is a module that will have Drupal automatically generate nice URLs. PathAuto requires Token to work.

Meta Tags (Nodewords)

Originally titled NodeWords, the Meta Tags module allows users to specify common meta tags, like meta keywords and meta description.

Get a copy of this module over at http://drupal.org/project/nodewords

CCK (Content Construction Kit)

CCK allows you to easily create new content types, without ever having to write any code! We'll use this for the company's external links section.

Get CCK at http://drupal.org/project/cck


The views module allows you to configure custom views for displaying content. They're very useful when you have complex content types and categories. Here we'll use Views to display Links.

Get the Views module at http://drupal.org/project/views

Install some modules

After you've downloaded and unpacked the above modules into /webroot/sites/all/modules, you can go ahead and install them.

Visit http://localhost/admin/build/modules to turn some of them on.

For this site, we'll need to install the following. Simply check the boxes and click "Save configuration".

  • Administration - Administration Menu
  • Core - Blog
  • Core - Contact
  • Core - Path
  • Content - Content
  • Content - Text
  • Other - Meta tags
  • Other - Pathauto
  • Other - Token
  • Views - Views
  • Views - Views UI
5. Content Types

Before we work with users and roles, we'll create our Links content type. Each Link will need a title, URL, and short description.

What's a node?

Almost every piece of content in Drupal is stored as a single node. All nodes have a title and an optional description. By creating content types, you can add fields to the content type to extend the node.

In our case, each Link will need one additional field that's not provided by default, the URL.

Create a Link content type

We'll create a content type called Link. We'll then add a field to the content type called URL.

Visit http://localhost/admin/content/types/add

In the name field, enter the human-readable name. In the type field, enter a unique name for the type. The system will use this name internally. You can make it up, but generally it'll look like a variable name, lowercase and underscored. Also enter a short description of the content type.

Next we'll modify slightly this content type from the general node. In the "Submission form settings" group, instead of "Body", we'll title the body field "Short Description".

Next, we'll edit the "Workflow settings." Allow the link to be published by default, and disable automatic promotion to the front page.

And finally, disable comments on the Links.

Save the content type. If you visit the "Create Content" page, you'll now see the new content type, Link.

Additional fields with CCK

So we've got our base Link content type set up. But we need to add an additional field to each Link: URL. Visit http://localhost/content/types and "Manage fields" for content type Link.

Add a field titled "url", and name it "field_url". Choose text data and text field.

Save it. Another page will come up, with some more options. The defaults are ok for this, so just contine by clicking "Save field settings". After this, the Link content type should appear like this:


Now let's set up a view for our new content type, Links.

Views can become quite complex, but for our example, we'll keep it very simple. We'll make a page view that displays Links. Plain and simple

Visit http://localhost/admin/build/views to get started. Click the tab "Add" to create a new view.

Name the view "Links" and choose type node.

The next few pages can grow quite complex, but be paitent. A bit of practice will get you more comfortable with views.

Firstly, we'll want our Links view to be a full page. So add a page display.

We'll have to make some settings next. Change the name and title of the view to Links. Set the "Row Style" to node, and choose to display teaser and links.

Make sure you're clicking "Update Default Display" every time.

Set the Path to "links". This will be the URL path and our page view will show up at http://localhost/links.

Then set a menu for the view. Choose "Normal menu entry", title it Links, and put it into Primary Links. (More on menus a bit later).

The Basic Settings area should be similar to this by now:

And finally for the view, we'll need to setup a filter. The filter will allow us to restrict the view to only display nodes of type "link".

Add a filter by using the "+" button at the top of the Filters box.

Scroll down until you find the filter titled "Node: Type". Check it's box, then add it as a filter.

Choose a node type of "Link".

At this point, our whole view should look very simliar to the following.

Save the view. We'll come back to it later.

7. Users, Roles, & Permissions

Next we'll set up some user roles and permissions, and then we'll create some real users. Refer to the site requirements above to refresh on what our users need to be able to do.

User settings

Only SmartMarks staff will be able to have accounts. Public registration will not be necessary for this site. So we need to restrict regsitration at http://localhost/admin/user/settings and disallow public registration.


We'll need a couple of roles. Since Shannon wants full control, we'll need an Admin role. Since Bill can modify certain things that others can't we'll setup a Manager role. And finally, the rest of SmartMarks' employees will need to belong to an Employee role.

Visit http://localhost/admin/user/roles to get started.

Create a role titled Admin.

Repeat the process to create two more roles, Manager and Employee. We should have something like this now.


Next, we'll define permissions for each of the roles. Visit http://localhost/admin/user/permissions to set up permissions. Set them up like so.

You may be wondering why we didn't give Manager too many permissions. This is because we'll set Bill to also be part of the Employee role, so Manager simply needs to be able to add and edit links. All of the permissions associated with Employee will be granted to Bill.

Now that we've got roles and permissions going, we can create our sites' users. User Role Shannon Admin Bill Employee, Manager Jean Employee Terry Employee

Go ahead and create these users at http://localhost/user/user/create, assigning roles to each of them. We should end up with something like this on http://localhost/admin/user/user:

8. Creating Content... Finally!

And finally we can start creating content. We're well over halfway done at this point.

Create pages

First off, let's begin with the home page. Visit http://localhost/content/add to create a new Page.

Enter the page title and some sample content for the home page. Set up a menu item for this page. You may also enter some meta tag info if you'd like.

Leave the URL alias setting alone. We'll let Pathauto handle it, and we'll set that up shortly.

Save the page and create another for the About page.

If you now visit the main page, you'll notice that we've got a menu already going. These items come from the pages we just made and from the view we made for Links earlier.

Create some Links

Next, we'll create a few links. Visit the create content page again, but this time choose Link. Create a few links.

After we've created a few links, we can visit the view for Links. Visit http://localhost/links to see our links. Here's what I've got. Remember this is coming from the view we made earlier.

Contact form

Drupal's built-in Contact module is totally sufficient for SmartMarks. We'll just need to set it up. Visit http://localhost/admin/build/contact and click "Add Category" to begin.

Add a category for "General Enquiries", enter Shannon's email as the only recipient, and set "Selected" to yes. This will cause this category to be the default for the contact form. (You could setup multiple categories to handle contact submissions for areas such as Sales, Support, etc.)

You may now view your contact form at http://localhost/contact

Create some blog entries

Last of the content, we'll make a few sample blog entries. We could log out, and then log back in as each user individually, creating a blog entry under each. Or, since you're already logged in as superuser, you can create a few entries and change the author to each user.

Visit http://localhost/node/add/blog and create a sample entry.

Under the authoring info, enter shannon. This entry will become Shannon's first blog entry.

Repeat that to create a blog entry for the other users (bill, terry, jean). Then visit http://localhost/blog to see the user blogs.

9. Finishing touches

We still have a few things to tidy up before we're done. We need to setup pathauto to handle automatic URL aliases, finish our menu, check out each user account, and then we'll add a few blocks to demonstrate a little about blocks.


Let's start with menus. We've already created a few menu items beneath the Primary Links menu. We did this when we created the view for Links and when we created each static page.

Visit http://localhost/admin/build/menu. Here you'll see several menus available. Choose Primary Links.

Choose "Add item". We'll create an item for the Contact form.

Note that the path is relative to the site root. So don't enter "/contact"; just enter "contact".

Repeat the above to create another menu item for user blogs, using a path of "blog". Then visit the tab "List items" to view all the menu items within the Primary Links menu. Now we can reorder the items using the drag and drop handles on the left.

Make sure to save!!!

Now our primary links in the header should be complete and sorted.


Next up, we'll setup pathauto to handle our nice URLs. Visit http://localhost/admin/build/path.

Before we configure paths, let's remove any existing URL aliases. You can do this by visiting the tab "Delete Aliases", then just go ahead and choose all aliases and delete them.

Now we'll setup the automatic aliases under the tab "Automated alias settings".

Open up "Blog path settings" and check the box to have the system "Bulk generate aliases".

Now open up the "Node path settings." Here we'll set up a few rules to handle paths for different node types. Use the replacement patterns (this is where the Token module comes into play) to set up appropriate paths. Make sure your URL alias scheme will produce only unique URLs! And be sure to have it "Bulk generate aliases."

Then save. Then view "List" again. You should see new aliases made for all of our existing content.

A note about URL aliases: Don't forget to delete aliases if you change your URL scheme and regenerate aliases. Deleting and recreating aliases may seem a bit scary, but the more you do it, the more confident you'll become in your URL scheme.


Shannon just informed us that she wants the site to highlight the company's recent office move. This is a good opportunity to go over blocks.

A block in Drupal is simply a 'chunk' of content, be it a list of nodes, some static HTML, a few images, or whatever. We'll set up a simple block to hold the notice about the office move.

Visit http://localhost/admin/build/block. Add a new block by using the tab "Add block".

After adding a block, you'll have to assign it to a region for display. Assign it to the left sidebar on http://localhost/admin/build/block, and don't forget to save!!!

You may also sort them with the drag handles, like menu items.

You should now see the new block displayed in the left sidebar after save.

Check user accounts

Now we're almost there. Just want to login as the users to make sure they've got the right permissions and that they can access the links to allow them to get stuff done.

Log out of the system and log back in as Shannon. Shannon is our administrator, so let's make sure she's able to create/edit all content. After logging in as Shannon, we should see a link to create content.

Go through and login as each user. Just take a look to make sure each one has the permissions and links available to get stuff done. If they don't, try going back to administer user permissions, and verify that they've been granted the correct permissions. Or also make sure you've correctly assigned roles.

Set the home page

We also need to tell Drupal to use our home page as the default home page. You can do this under http://localhost/admin/settings/site-information.

Before you change this data, though, we need to grab the node id of our home page. Visit our welcome page at http://localhost/welcome-smartmarks. Click or mouse-over the "Edit" tab; we just need the node's ID.

Our home page has a node id of 1, so we'll use that for the default home page. Visit http://localhost/admin/settings/site-information and enter some data. At the bottom, you'll see a field for the default home page. Enter "node/1". Note that we're using the node id becuase of pathauto. If we were to change the URL alias of the home page, then we won't have to change its node id, since it will remain the same. Drupal will automatically print out the correct URL alias.

10. Summary

This overview only scratches the surface of what Drupal can do. Hopefully I've given you a good overview of how to get started with the system in building this very simple CMS.


Drupal supports multiple themes, and each user can even chose their own theme.

Building a custom theme is out of the scope of this tutorial. But you can download and install some contributed themes. A good starting place is over at Theme Garden. Download and unpack themes into /webroot/sites/all/themes, then enable and configure them at http://localhost/admin/build/themes. Note that whenever you activate a new theme, you'll have to visit the blocks page to assign blocks to the theme's regions.

If you're ready to start building a theme, you might want to check out the Theme Guide.

Good luck!

Good luck in your Drupal ventures, and feel free to ask questions! Also check out http://drupal.org for more information and helpful articles.

Categories: FLOSS Project Planets

Peoples Blog: Usage of Constraints (Validations) on Media Entities in Drupal Application

Planet Drupal - Wed, 2022-11-30 21:30
In this article we are going to see how drupal developers can use the Drupal Constraints to Validate the Media entities. Basically Drupal provides Constraints to do the Validations on the Entities, where Drupal uses the Symfony’s validator and extends with Symfony’s Typed Data API for validating specific Entity field definitions. These constraint validators can be used in different w
Categories: FLOSS Project Planets

Peoples Blog: Usage of Local Php Security Checker for Drupal Applications

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to see how the Local PHP Security Checker library will make people's lives easier during the development & code review process. To make developer life easier, developers look for tools or libraries which can automated security review. Here comes the Local PHP Security Checker library, which checks for any known vulnerabilities in the package dependencies. Th
Categories: FLOSS Project Planets

Peoples Blog: Read Data to Paragraph Template in Drupal Application

Planet Drupal - Wed, 2022-11-30 21:30
In this article we are going to see how to read the dynamic data of the node or entity or field values to the template file, which are specific to the paragraph template. Generally while the Paragraph module is used, default template suggestions given by the paragraph module or the template suggestions provided by the hooks are used and further template design is done. Here’s the article wh
Categories: FLOSS Project Planets

Peoples Blog: How to work with Drupal Paragraphs?

Planet Drupal - Wed, 2022-11-30 21:30
Paragraphs can be used as a way for Content Creation in Drupal. It actually allows the site builders to do their stuff a bit cleanly and for the end users this will be pretty easy to manage the content, meaning people get more control on the Editing side. Paragraphs is one of the  popular modules in Drupal, for handling content. It is more or less very similar to the fields and will provide
Categories: FLOSS Project Planets

Peoples Blog: Usage of PhpStan on Github via Pull Request for Drupal Applications

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to see how some tools & libraries will make people's lives easier during the development and code review process. We have a similar helpful article related to Phpcs, have a check of this. To make developer life easier, developers look for tools or libraries which can automated code review and if needed make any corrections in the code automatically. Here come
Categories: FLOSS Project Planets

Peoples Blog: How to work with Twig Templates in Drupal?

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to see how a developer can work with Twig templates, and how to override templates (if needed) and create template suggestions with hooks, so that templates could be easily managed. Basically drupal allows people to override the existing twig templates, so that people can fully have control on the html generated via the custom theme. First thing, we need to make sur
Categories: FLOSS Project Planets

Peoples Blog: Quick reference of Code Reviews for Drupal Application

Planet Drupal - Wed, 2022-11-30 21:30
In this article we are going to see how your Drupal team can do code reviews and available tools or libraries which help people in the team to do the code reviews seamlessly. It’s pretty important to follow a few guidelines as well, so that all people or developers in the team are on the same page. Firstly, for the code reviews to be at their best, the committed code should be more organis
Categories: FLOSS Project Planets

Peoples Blog: Usage of PHPCS on Github via Pull Request for Drupal Applications

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to see how some tools & libraries will make people's lives easier during the development & code review process. And to make developer life easier, developers look for tools or libraries which can automated code review and if needed make any corrections in the code automatically. Here comes the PHP codesniffer and Drupal coder module. If you are maintaini
Categories: FLOSS Project Planets

Peoples Blog: Store Secrets Securely on Pantheon for Drupal Application

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to see how people can store access keys and tokens securely, in the case of your drupal application that is managed on pantheon. Generally, all the Access keys or Tokens or any Secret third party auth information should not be stored in the database or within the project web root, Its safe to store it encrypted and within a file, and keep the file outside of the proj
Categories: FLOSS Project Planets

Peoples Blog: Configuration management via Quicksilver on Pantheon

Planet Drupal - Wed, 2022-11-30 21:30
As we saw in the earlier article, like how we manage the configuration across the environments. In this article we are going to see how Drupal configurations can be deployed or imported across the environments with the help of Quicksilver which hooks into platform workflows to automate your Pantheon WebOps workflow across the environments. In the pantheon environment’s drupal code base, yo
Categories: FLOSS Project Planets

Peoples Blog: Drupal Configuration management (Local, Dev, Test and Live)

Planet Drupal - Wed, 2022-11-30 21:30
In this article we are going to see how Drupal serves configurations across the environments, which can be well maintained with help of some contributed modules and version control. Drupal 8 onwards configuration has been saved in the yml files in a consistent manner, which includes all the enabled modules, all the content types, vocabularies, fields & views. Making the configurations direct
Categories: FLOSS Project Planets

Peoples Blog: Migrate your site from Drupal 7 To Drupal 9?

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to see what are the important things you need to understand for the migration of your Drupal 7 site to the Drupal 9 site. And if you see from your Business perspective, Drupal 7 was launched nine years ago, and this is the perfect time for some reassessment of the needs of site users & content managers. And if you see from Drupal’s end, Initially, Drupal 7 end of li
Categories: FLOSS Project Planets

Peoples Blog: Improve Drupal Search with Solr, Locally configured via Lando

Planet Drupal - Wed, 2022-11-30 21:30
In this article, we are going to learn how Drupal search can be improved with Solr which provides great performance, and is suitable even for use on large commercial websites. And along with this using the search_api & search_api_solr modules, helps to configure the Facets & Multilingual content can be handled in an improved manner. And let's see how we can configure this locally with the help of
Categories: FLOSS Project Planets

STX Next: What Is Django and What Is Django Used for?

Planet Python - Wed, 2022-11-30 20:12

If you love building software with Python and are looking to enter the field of web development, Django might be the tool that will help you realize your goals. One of the most popular Python frameworks, Django features excellent built-in solutions for almost every common task in web development. This means you can write code faster and deliver projects more efficiently.

Categories: FLOSS Project Planets

STX Next: 10 Best Python Books

Planet Python - Wed, 2022-11-30 19:33

Python is an incredibly powerful programming language. Due to its versatile nature and simplicity, it continues to capture the interest of developers, those new and experienced alike.

Categories: FLOSS Project Planets

Matt Layman: Blackjack and Bugs - Building SaaS with Python and Django #151

Planet Python - Wed, 2022-11-30 19:00
In this episode, we started with a Python exercise on Exercism that explored Blackjack. We wrote functions that handled some of Blackjack’s core rules. After the Python exercise, we focused on a bug in the Django app that fixed an edge case with some the teacher checklist feature.
Categories: FLOSS Project Planets

Sebastian Witowski: dict() vs. {}

Planet Python - Wed, 2022-11-30 19:00

There are two different ways to create a dictionary. You can call the dict() function or use the literal syntax: {}. And in many cases, these are equivalent choices, so you might give it little thought and assume they both take the same amount of time.

But they don't!

Starting with this article, in my benchmarks, I have switched from Python 3.8 to 3.11. So if you're following the Writing Faster Python series and you're wondering why my code examples suddenly got a bit faster - that's the reason.

Check out the Upgrade Your Python Version article for a comparison of how much faster we can get by simply upgrading the CPython version.

# Python 3.11.0
$ python -m timeit "dict()"
10000000 loops, best of 5: 29.8 nsec per loop

$ python -m timeit "{}"
20000000 loops, best of 5: 14.2 nsec per loop

Benchmarking both versions shows that calling {} is twice as fast as calling dict(). And that's for Python 3.11. If you run the same examples with an older version of Python, dict() is even slower:

# Python 3.8.13
$ python -m timeit "dict()"
5000000 loops, best of 5: 57.2 nsec per loop

$ python -m timeit "{}"
20000000 loops, best of 5: 14.2 nsec per loop

Here dict() is almost four times as slow as {}.

Looking under the hood with the dis module #

Let's use the disassembler module to compare what's happening when we call dict() and {}:

>>> from dis import dis
>>> dis("dict()")
0 0 RESUME 0

4 LOAD_NAME 0 (dict)
10 CALL 0
>>> dis("{}")
0 0 RESUME 0


The dis module returns the bytecode instructions from a code snippet. It's an excellent way to see what's happening under the hood of your programs. Don't worry if all those cryptic names seem unfamiliar (if you're curious, check out the Python Bytecode Instructions). For us, the important instructions are BUILD_MAP and CALL.

When we call {}, we execute a Python statement, so Python immediately knows what to do - build a dictionary. In comparison, when we call dict(), Python has to find the dict() function and call it. That's because nothing stops you from overriding the dict() function. You can make it do something completely different than creating a dictionary, for example:

def dict(*args, **kwargs):
# Happy debugging ;)
return list([1, 2, 3])

Python doesn't stop you from overriding the built-in functions. So when you call dict(), the interpreter has to find this function and call it.

Is there any other difference? #

I tried to think of any other reason why you might use dict() over {}, and the only one that came to my mind was for creating a dictionary from an iterator.

Take a look at this example:

>>> iter = zip(['a', 'b', 'c'], [1,2,3])
>>> {iter}
{<zip at 0x102d57b40>} # This is not really what we want
>>> dict(iter)
{'a': 1, 'b': 2, 'c': 3} # Much better

We can't use the literal syntax to create a dictionary. We would have to use a dictionary comprehension: {k: v for k, v in iter}. But a simple dict(iter) looks much cleaner. Apart from this use case, I think it's mostly up to your preference which version you use.

There are also some interesting quirks that I found. For example, in CPython 3.6 and below, if you wanted to pass more than 255 arguments to a function, you would get a SyntaxError. So, in this case, dict() is a no-go, but {} should work. However, if you're passing over 255 parameters to a function, you probably have bigger problems in your code than wondering if the literal syntax is a few nanoseconds faster.

[] vs. list(), () vs. tuple, {'x', } vs. set(['x']) #

The same rule applies to using [] vs. list(), () vs. tuple(), or {'x',} vs. set(['x']). Using the literal syntax is faster than calling the corresponding function:

$ python -m timeit "list()"
10000000 loops, best of 5: 28.5 nsec per loop

$ python -m timeit "[]"
20000000 loops, best of 5: 12.7 nsec per loop

$ python -m timeit "tuple()"
50000000 loops, best of 5: 9.93 nsec per loop

$ python -m timeit "()"
50000000 loops, best of 5: 4.45 nsec per loop

$ python -m timeit "set(['x'])"
5000000 loops, best of 5: 72.7 nsec per loop

$ python -m timeit "{'x',}"
10000000 loops, best of 5: 29.5 nsec per loop

Of course, if you construct a large data structure, the difference between the two versions becomes unnoticeable:

$ python -m timeit "list(range(1_000_000))"
20 loops, best of 5: 14 msec per loop

$ python -m timeit "[*range(1_000_000)]"
20 loops, best of 5: 14 msec per loop
Categories: FLOSS Project Planets

KDE e.V. board sprint, Berlin

Planet KDE - Wed, 2022-11-30 18:00

In two weeks, the board of KDE e.V. – and take note that photo of me is before 3 years of COVID-hair – will convene in Berlin for one of our board sprints.

The board meets weekly online, using the Big Blue Button infrastructure that KDE has for meetings, online get-togethers, virtual sprints and hybrid conferences. In an hour or two we get through the week’s “needs doing now” and “approve this request from the membership or community” items. But some things are not very well suited for online discussion. Sometimes we need to physically sign papers (Germany, old-fashioned, etc.). And of course, drinking tea together is what really makes a team.

Hmm, yes, there is “tea” in team. Make mine a Yunnan FOP.

But it’s not just all fun and games. Actually, hardly any: we get to spend 10 hours a day at the office over a weekend doing KDE e.V. board and administrative stuff. In the evening, though, we’ll meet up with some KDE folks in and around Berlin and potentially consume more tea.

(And when in Germany I always stock up on a handful of typically German products, like knödel – a good KDE name, although I can’t imagine an application carrying it)

Categories: FLOSS Project Planets

Enrico Zini: Things I learnt in November 2022

Planet Debian - Wed, 2022-11-30 18:00


  • You can Build-Depend on debhelper-compat (=version) and get rid of debhelper as a build-dependency, and of debian/compat (details)
  • You can Build-Depend on dh-sequence-foo and get rid of the correspondingdh-foobuild-dependency, and of the need to add--with fooindebian/rules` (details)
  • You can (and should) get rid of dh-buildinfo, which is now handled automatically
  • In salsa.debian.org there is a default CI pipeline for Debian packages that works beautifully without needing to add any .gitlab-ci.yml to a repository
  • Add Testsuite: autopkgtest-pkg-python to debian/control, and you get a free autopkgtest that verifies that your packaged Python module can be imported. The default CI pipeline in salsa will automatically run the tests. (specification, details)


  • From Python 3.8, you can use = in format strings to make it easier to debug variables and expressions (details):
>>> name="test" >>> print(f"{name=}") name='test' >>> print(f"{3*8=}") 3*8=24


  • [abc].tile.openstreetmap.org links need to be replaced with tile.openstreetmap.org (details)
Categories: FLOSS Project Planets