There is DRY, and there is readability. Every function is a black box from the call, the tendency is to DRY when you are 'one with the code' and the black boxes are fresh in your mind. Then, when you come back to the code later - you are trying to infer what is happening inside the boxes simply from the function names.
Congratulations, you have just atomized your code. And when you did it, you probably were using some type of naming convention that was conducive to typing instead of describing -- using short names that allowed you to 'zoom out' on the code line.
When you come back to it, your ego will be stroked with thoughts of "I must have been a genius the day I wrote this!" -- because you can't understand it now without sitting in the lotus position and meditating deeply.
There is a lot to be said in favor of 'flat coding' and copy/paste extensibility. On the other hand, you have the power of a well-developed framework.
You have to ask yourself, 'what am I making here' -- is any of this a framework that I can extract and formalize? Will I do it? What is my deadline?
So you have a tension along the spectrum of modularity/frameworks and flat code that says what it does right in your face. Don't take DRY and other best practices as a religion, look at your real-world goals and tackle the problem like an infantryman -- your job is to kill the deadline and not leave too many innocent corpses in your wake.